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