簡體   English   中英

為什么我的代碼需要 cout 才能使 printf() 工作?

[英]Why does my code need cout for printf() to work?

我對編碼很陌生,在嘗試編寫一個打印數組中最大數字的程序時偶然發現了這個問題。

基本上,如果我不包括cout<<i; printf()將打印數組位置而不是數字 20。任何想法為什么? (我猜這是我忽略的一些愚蠢的事情,所以提前抱歉)。

#include <iostream>
using namespace std;

int maxinlst(int lst[], int size) {
    int maxNum;
    for (int i = 0; i < size; i++) {
        cout << i;
        if (lst[i] == lst[0])
            int maxNum = lst[i];

        else if (maxNum < lst[i]) {
            maxNum = lst[i];
        }
    }

    return maxNum;
}

int main() {
    int lst[] = {-19, -3, 20, -1, 5, -25};

    printf("%i", maxinlst(lst, 6));
}

您通過聲明另一個具有相同名稱的變量來maxInt 在這里查看我的評論:

int maxinlst(int lst[], int size) {
    // First declaration
    int maxNum;
    for (int i = 0; i < size; i++) {
        cout << i;
        if (lst[i] == lst[0])
            // Second declaration
            int maxNum = lst[i];

        else if (maxNum < lst[i]) {
            maxNum = lst[i];
        }
    }

    return maxNum;
}

這在 C++ 和大多數帶有塊 scope 的語言中是合法的。 第二個聲明創建了一個新變量,但它從未使用過,因為它立即超出 scope,因此編譯器可以消除整個賦值以及條件。 如果您啟用編譯器警告,您應該會收到有關第二個聲明的警告,因為該變量不再使用:

test.cpp: In function ‘int maxinlst(int*, int)’:
test.cpp:8:17: error: unused variable ‘maxNum’ [-Werror=unused-variable]
             int maxNum = lst[i];
                 ^~~~~~

這也意味着在循環的第一次迭代之后外部maxNum的值是不確定的,讀取它可能是未定義的行為,因此第二次循環迭代要么將 (a) 使用不確定的值,因為外部maxNum從未被分配或(b) 完全因為 UB 的其他事情。

如果第二個條件永遠不為真(假設一個不確定的值而不是 UB),那么這個 function 返回的值也將是不確定的——無論maxNum碰巧是什么不可預測的數字。

這里的更正是在第二個聲明中刪除int

你也可以重寫它來避免第一個循環條件:

int maxinlst(int lst[], int size) {
    // First declaration
    int maxNum = lst[0];
    for (int i = 1; i < size; i++) {
        if (maxNum < lst[i]) {
            maxNum = lst[i];
        }
    }

    return maxNum;
}

至於為什么cout << i會更改您看到的值,這正是使用不確定值/未定義行為的本質。 你無法推理正在發生的事情。 添加或刪除其他代碼也可能會更改 function 返回的值。 如果您多次運行程序而不對其進行任何更改,您甚至可能會看到不同的值。

您實際上有兩個名為maxNum的變量。 在您的 if 語句中, int maxNum = lst[i]定義了一個名為maxNum的新變量,它隱藏了外部maxNum變量。 一旦程序退出 if 語句,內部的、新定義的maxNum就會被銷毀。

是什么讓您認為正在打印陣列位置?

maxNum在定義時未設置為特定值。 因此,它只會擁有之前存儲在 memory 中的任何內容。

如果 memory 中的值很大,那么maxNum將大於數組中的所有值,那么maxNum將永遠不會改變,它會保留垃圾值。

因此,當您到達printf語句時,垃圾值將是 output。 我懷疑陣列的位置是 output。 我敢打賭,這就是 memory 中的垃圾。

為什么我的代碼與 cout 有問題&lt; <num0+num1?< div><div id="text_translate"><p> 代碼在main中有問題。 當我嘗試cout&lt;&lt;num0-num1; 單獨或cout&lt;&lt;num0+num1; 單獨他們工作正常,但是當我一起做時,代碼只是停止打印其中一個,代碼的 rest 停止。 我的意思是:如果我把主要寫成:</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;"idk whats wrong";</pre><p> 它工作正常並打印出來:</p><pre> 90/150 13/65 2/5 1/1 idk whats wrong Process returned -1073741819 (0xC0000005) execution time: 2.184 Press any key to continue.</pre><p> 但是,如果我把它寫成</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong";</pre><p> 它打印:</p><pre> Hello world: 90/150 13/65 2/5 Process returned -1073741819 (0xC0000005) execution time. 2.608 s Press any key to continue.</pre><p> 這是代碼:<strong>主要:</strong></p><pre class="lang-cpp prettyprint-override"> #include &lt;iostream&gt; using namespace std; #import "Fraction.h" int main() { cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong"; return 0; }</pre><p> <strong>分數 header:</strong></p><pre class="lang-cpp prettyprint-override"> #ifndef FRACTION_H #define FRACTION_H #include &lt;iostream&gt; using namespace std; class Fraction { public: Fraction(int num, int denom); Fraction(); Fraction reducedFraction(Fraction fract); Fraction operator+(const Fraction &amp;fraction); Fraction operator-(const Fraction &amp;fraction); Fraction&amp; operator= (const Fraction &amp;fraction); Fraction operator/(const Fraction &amp;fraction); Fraction operator*(const Fraction &amp;fraction); bool operator&lt;(const Fraction &amp;fraction); bool operator&gt;(const Fraction &amp;fraction); bool operator&lt;=(const Fraction &amp;fraction); bool operator&gt;=(const Fraction &amp;fraction); bool operator==(const Fraction &amp;fraction); friend ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction); friend istream&amp; operator&gt;&gt;(istream&amp; is, Fraction&amp; fraction); void setNum(int num); int getNum(); void setDenom(int denom); int getDenom(); virtual ~Fraction(); private: int num; int denom; int* arrN; int* arrD; int* arrC; }; #endif // FRACTION_H</pre><p> <strong>分數.cpp</strong></p><pre> #include "Fraction.h" Fraction::Fraction() { num=1; denom=1; } Fraction::Fraction(int num,int denom) { this-&gt;num=num; this-&gt;denom = denom; } void Fraction::setNum(int num) { this-&gt;num = num; } void Fraction::setDenom(int denom) { this-&gt;denom = denom; } int Fraction::getDenom() { return denom; } int Fraction::getNum() { return num; } Fraction Fraction::operator+(const Fraction&amp; fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)+(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator-(const Fraction &amp;fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)-(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator*(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.num; tmp.denom=this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator/(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.denom; tmp.denom=this-&gt;denom*fraction.num; return reducedFraction(tmp); } bool Fraction::operator==(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)==(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } Fraction&amp; Fraction::operator= (const Fraction &amp;fraction) { this-&gt;num=fraction.num; this-&gt;denom = fraction.denom; return *this; } ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction) { os&lt;&lt;fraction.num&lt;&lt;"/"&lt;&lt;fraction.denom&lt;&lt;endl; return os; } Fraction Fraction::reducedFraction( Fraction fract) { int* arrN = new int[fract.num]; int* arrD = new int[fract.denom]; int* arrC; int countN=0; int countD=0; for (int i = 2; i&lt;=fract.num; i++) { if (fract.num%i==0) { arrN[countN]=i; countN++; } } for (int i = 2; i&lt;=fract.denom; i++) { if (fract.denom%i==0) { arrD[countD]=i; countD++; } } if (countN&gt;=countD) { arrC = new int[countN]; } else { arrC = new int[countD]; } int countC =0; for ( int i = 0; i &lt;countN; i++) { for (int j=0; j&lt;countD; j++) { if(arrN[i]==arrD[j]) { arrC[countC]=arrN[i]; countC++; } } } int maxN = arrC[0]; for ( int i =1; i&lt;countC; i++) { if (arrC[i]&gt;maxN) { maxN=arrC[i]; } } Fraction tmp; tmp.num = fract.num/maxN; tmp.denom=fract.denom/maxN; return tmp; } Fraction::~Fraction() { delete[]arrC; delete[]arrN; delete[]arrD; }</pre> </div></num0+num1?<>

[英]Why does my code have trouble with cout<<num0+num1?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 為什么printf和cout對此代碼給出不同的輸出? cout沒有輸出,但printf確實如此 為什么eclips在我的代碼中不知道cout和cin? 為什么我的代碼首先執行后面的cout? 為什么我的代碼與 cout 有問題&lt; <num0+num1?< div><div id="text_translate"><p> 代碼在main中有問題。 當我嘗試cout&lt;&lt;num0-num1; 單獨或cout&lt;&lt;num0+num1; 單獨他們工作正常,但是當我一起做時,代碼只是停止打印其中一個,代碼的 rest 停止。 我的意思是:如果我把主要寫成:</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;"idk whats wrong";</pre><p> 它工作正常並打印出來:</p><pre> 90/150 13/65 2/5 1/1 idk whats wrong Process returned -1073741819 (0xC0000005) execution time: 2.184 Press any key to continue.</pre><p> 但是,如果我把它寫成</p><pre class="lang-cpp prettyprint-override"> cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong";</pre><p> 它打印:</p><pre> Hello world: 90/150 13/65 2/5 Process returned -1073741819 (0xC0000005) execution time. 2.608 s Press any key to continue.</pre><p> 這是代碼:<strong>主要:</strong></p><pre class="lang-cpp prettyprint-override"> #include &lt;iostream&gt; using namespace std; #import "Fraction.h" int main() { cout &lt;&lt; "Hello world;" &lt;&lt; endl, Fraction num0(90;150), Fraction num1(13;65); Fraction num2; cout&lt;&lt;num0; cout&lt;&lt;num1; cout&lt;&lt;num0-num1; cout&lt;&lt;num2; cout&lt;&lt;num0+num1; cout&lt;&lt;"idk whats wrong"; return 0; }</pre><p> <strong>分數 header:</strong></p><pre class="lang-cpp prettyprint-override"> #ifndef FRACTION_H #define FRACTION_H #include &lt;iostream&gt; using namespace std; class Fraction { public: Fraction(int num, int denom); Fraction(); Fraction reducedFraction(Fraction fract); Fraction operator+(const Fraction &amp;fraction); Fraction operator-(const Fraction &amp;fraction); Fraction&amp; operator= (const Fraction &amp;fraction); Fraction operator/(const Fraction &amp;fraction); Fraction operator*(const Fraction &amp;fraction); bool operator&lt;(const Fraction &amp;fraction); bool operator&gt;(const Fraction &amp;fraction); bool operator&lt;=(const Fraction &amp;fraction); bool operator&gt;=(const Fraction &amp;fraction); bool operator==(const Fraction &amp;fraction); friend ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction); friend istream&amp; operator&gt;&gt;(istream&amp; is, Fraction&amp; fraction); void setNum(int num); int getNum(); void setDenom(int denom); int getDenom(); virtual ~Fraction(); private: int num; int denom; int* arrN; int* arrD; int* arrC; }; #endif // FRACTION_H</pre><p> <strong>分數.cpp</strong></p><pre> #include "Fraction.h" Fraction::Fraction() { num=1; denom=1; } Fraction::Fraction(int num,int denom) { this-&gt;num=num; this-&gt;denom = denom; } void Fraction::setNum(int num) { this-&gt;num = num; } void Fraction::setDenom(int denom) { this-&gt;denom = denom; } int Fraction::getDenom() { return denom; } int Fraction::getNum() { return num; } Fraction Fraction::operator+(const Fraction&amp; fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)+(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator-(const Fraction &amp;fraction) { Fraction tmp; tmp.num=(this-&gt;num*fraction.denom)-(fraction.num*this-&gt;denom); tmp.denom =this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator*(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.num; tmp.denom=this-&gt;denom*fraction.denom; return reducedFraction(tmp); } Fraction Fraction::operator/(const Fraction &amp;fraction){ Fraction tmp; tmp.num=this-&gt;num*fraction.denom; tmp.denom=this-&gt;denom*fraction.num; return reducedFraction(tmp); } bool Fraction::operator==(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)==(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&gt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&gt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } bool Fraction::operator&lt;=(const Fraction &amp;fraction){ if((this-&gt;num/this-&gt;denom)&lt;=(fraction.num/fraction.denom)){ return true; } else { return false; } } Fraction&amp; Fraction::operator= (const Fraction &amp;fraction) { this-&gt;num=fraction.num; this-&gt;denom = fraction.denom; return *this; } ostream&amp; operator&lt;&lt;(ostream&amp; os, const Fraction&amp; fraction) { os&lt;&lt;fraction.num&lt;&lt;"/"&lt;&lt;fraction.denom&lt;&lt;endl; return os; } Fraction Fraction::reducedFraction( Fraction fract) { int* arrN = new int[fract.num]; int* arrD = new int[fract.denom]; int* arrC; int countN=0; int countD=0; for (int i = 2; i&lt;=fract.num; i++) { if (fract.num%i==0) { arrN[countN]=i; countN++; } } for (int i = 2; i&lt;=fract.denom; i++) { if (fract.denom%i==0) { arrD[countD]=i; countD++; } } if (countN&gt;=countD) { arrC = new int[countN]; } else { arrC = new int[countD]; } int countC =0; for ( int i = 0; i &lt;countN; i++) { for (int j=0; j&lt;countD; j++) { if(arrN[i]==arrD[j]) { arrC[countC]=arrN[i]; countC++; } } } int maxN = arrC[0]; for ( int i =1; i&lt;countC; i++) { if (arrC[i]&gt;maxN) { maxN=arrC[i]; } } Fraction tmp; tmp.num = fract.num/maxN; tmp.denom=fract.denom/maxN; return tmp; } Fraction::~Fraction() { delete[]arrC; delete[]arrN; delete[]arrD; }</pre> </div></num0+num1?<> 為什么std :: cout不打印並集值,而printf可以呢? 為什么使用printf和cout的代碼沒有預期的輸出? 為什么在C循環中使用printf的Rust代碼不能顯示輸出,而在C ++循環中使用std :: cout可以顯示輸出呢? 為什么printf中相同表達式的輸出與cout不同? 為什么這個 RAII cout 重定向器不起作用:
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM