[英]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.