簡體   English   中英

C程序有趣的行為

[英]C program interesting behaviour

我偶然發現了一段代碼,在調試別人的程序時產生了一些有趣的結果。

我創建了一個小程序來說明這種行為:

#include <stdio.h>

int main()
{
        char* word = "foobar"; int i, iterator = 0;
        for (i = 0; i < 6; i++ && iterator++)
          printf("%c", word[iterator]);
        return 0;
}

我知道這不是打印字符串的正確方法。 這僅用於演示目的。

在這里,我預計輸出是“foobar”,顯然,但它是“ffooba”。 基本上它會兩次讀取第一個字符,就好像第一次執行iterator++沒有任何反應。

誰能解釋為什么會這樣?

事情是iterator++實際上並沒有第一次執行。 ++運算符返回變量的當前值, 然后遞增它,所以第一次通過, i++將等於0 &&短路,所以iterator++不是第一次執行。

要解決此問題,您可以使用逗號運算符無條件地評估兩者,而不是短路&&

的結果i++是的當前值i是零上第一次迭代。 這意味着iterator++不會在第一次迭代時由於短路而執行( &&的右側在左側為“真”時執行)。

要修復你可以使用逗號運算符(如已建議或)使用++i ,它將在遞增后返回i的值(盡管逗號運算符更明顯,必須始終評估兩者)。

你真的應該學會使用像gdb這樣的調試器,並使用警告和調試信息編譯,如gcc -Wall -g (假設是一個Linux系統)。 最近使用-Wall gcc會在&&操作之前為您提供有關計算值的警告。

for循環的增量部分很奇怪。 它是i++ && iterator++ (但它應該是i++, iterator++ )。

i為0(在第一次迭代時), i++給出0作為結果,因此它是假的,因此iterator++不會被執行。

我正在閱讀關於邏輯運算符的K&R,讓我引用本書的原始詞,這可以解釋你的問題。 “通過&&或||連接的表達式從左到右進行評估,一旦知道結果的真實性或錯誤性,評估就會停止。” 對這些有很好的理解,輸出不會謎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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