【问题标题】:Code it being affected by a cout which is not need it code受不需要它的 cout 影响的代码
【发布时间】:2020-12-23 09:01:12
【问题描述】:

该程序只是有一个函数来检查一个数字是否是一个完美的数字。完美是其所有因素(不包括数字本身)的总和等于其自身的数字。喜欢6(1 + 2 + 3 = 6) 也喜欢28

我看到了一个奇怪的行为。有cout << ""。如果我们删除此行代码将无法正常工作,如果我们把它一切工作正常。这个我看不懂

#include<iostream>
using namespace std;

int IsPerfect(int);
int main(){
    
    int N, j;
    cout << "Enter a value for N: ";
    cin >> N;
    cout  << "Perfect numbers are ";
    for(j=1; j<=N; j++){
        cout << ""; //If you remove this line no output will be printed
        if(IsPerfect(j) == 1){
            cout  <<  j << endl;
        }
    }
}

int IsPerfect(int a){
    int sum=0;
    for(int i; i<a; i++){
        if(a%i == 0){
            sum=sum+i;
        }
    }
    if(sum == a){
        return 1;
    }   
    else{
        return 0;
    }
}

【问题讨论】:

  • cout &lt;&lt; "" 无关紧要。无论如何,您都有未定义的行为,因为来自for(int i; i&lt;a; i++){i 未初始化使用。打开所有编译器警告以发现此类错误。

标签: c++ cout


【解决方案1】:

代码与cout 无关。查看isPerfect 函数中的循环。变量i 具有未定义的值,因为它没有被初始化。像这样初始化它:

for(int i = 1; i<a; i++){

【讨论】:

  • 嗯,UB 的有趣之处在于添加或删除输出语句可以改变程序的行为,这是 OP 观察到的,但仍然是一个很好的答案。
  • 您看到了什么输出?与cout &lt;&lt; ""
  • @Yksisarvinen 这正是我要说的
  • @MaheerAli 我不确定你是否理解 Yksisarvinen 的评论。由于 abdullah 的回答中提到的问题,您的程序具有未定义的行为。具有未定义行为的程序会做一些奇怪的事情。删除未定义的行为,怪异就会消失。
  • @MaheerAli 它是一个空字符串,不会输出空字符串 (char*)。当您研究更多有关内存和变量初始化的知识时,您会发现有一些称为垃圾的数据被分配。您看到的行为完全独立于 cout。现象取决于垃圾值,如果有机会将变量初始化为 0,1 或任何好的数字;你得到你想要的输出。我在 3 次运行中没有看到任何输出。
猜你喜欢
  • 2014-09-17
  • 2016-04-27
  • 1970-01-01
  • 2012-11-07
  • 2022-07-15
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多