簡體   English   中英

需要一些幫助來理解奇怪的C行為

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM