[英]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 中的垃圾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.