[英]Need some help understanding a weird C behavior
這部分代碼運行正常:
#include <stdio.h>
int main(){
//char somestring[3] = "abc";
int i, j;
int count = 5;
for((i=0) && (j=0); count > 0; i++ && j++){
printf("i = %d and j = %d\n", i, j);
count--;
}
return 0;
}
輸出如預期:
i : 0 and j : 0
i : 1 and j : 1
i : 2 and j : 2
i : 3 and j : 3
i : 4 and j : 4
當我在函數體的第一行取消注釋char字符串聲明時,事情變得奇怪了。
#include <stdio.h>
int main(){
char somestring[3] = "abc";
...
}
輸出:
i : 0 and j : 4195392
i : 1 and j : 4195393
i : 2 and j : 4195394
i : 3 and j : 4195395
i : 4 and j : 4195396
這背后的邏輯是什么? 我在Ubuntu 9.10上使用gcc 4.4.1。
由於&&
的短路行為 , j
永遠不會被初始化。 由於(i=0)
求值為假, (j=0)
永遠不會被執行,因此j
得到隨機值。 在第一個例子中,恰好是零。
你應該說i=0, j=0
來實現你想要的。
i++ && j++
有同樣的問題; 它應該是i++, j++
。
這個:
char somestring[3] = "abc";
因為字符串中的尾隨NUL字符,所以保留一個太少的字節 - 你需要四個字節。 但是,如果您不打算修改字符串,則無需指定字節數 - 您可以這樣說:
char *somestring = "abc";
代替。
如果使用&&,則只有第一個參數被判斷為false。 i = 0為false,因此j不會設置為0.您應該使用komma運算符:
for((i=0) , (j=0); count > 0; i++, j++){ [...]
for((i=0) && (j=0)...
似乎已經不正確了。
i=0
已經為0,因此不需要j=0
的評估,因此跳過它。
(i++) && (j++)
對於第一次迭代似乎也是錯誤的,出於同樣的原因。
您正在使用(i==0) && (j==0)
初始化循環中的兩個變量。
但是,&&的屬性是,如果第一個操作數的計算結果為FALSE(即0),則永遠不會執行第二個操作數。 因此,當我為0時,j未被初始化。 在你的第一次運行中,你很幸運它碰巧包含值0。
您的變量i&j未初始化。 (i=0) && (j=0)
什么意思? 編譯器將創建一個快捷方式,並且僅指定i=0
j保持未初始化,具有您描述的效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.