繁体   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