這是在線測試中向我詢問的代碼。考慮這個代碼。爲什麼此代碼正在打印1,-1
int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);
上面的代碼將打印
1, -1
有人可以解釋爲什麼輸出出來是1, -1
而不是1, 1
。
這是在線測試中向我詢問的代碼。考慮這個代碼。爲什麼此代碼正在打印1,-1
int i = -1, j = -1;
(i=0)&&(j=0);
(i++)&&(++j);
printf("%d, %d\n", i, j);
上面的代碼將打印
1, -1
有人可以解釋爲什麼輸出出來是1, -1
而不是1, 1
。
C對少數操作員實施短路評估。其中之一是&&
。這意味着如果&&
的左側評估爲false
,則右側將不會被評估。
此外,++i
和i++
之間有所不同。 i++
將返回i
和商店i+1
。另一方面,++i
將返回i+1
和商店i+1
。
因此:
int i = -1, j = -1; // i = -1, j = -1
(i=0)&&(j=0); // i = 0, j = -1 (right hand side not evaluated because lhs evaluated to 0)
(i++)&&(++j); // i = 1, j = -1 (right hand side not evaluated because lhs evaluated to 0)
printf("%d, %d\n", i, j);
return 0;
如果考慮評估的順序這是一種顯而易見的。第一個& &只執行第一個任期。 i = 0之前& &評估。第二個& &也只執行第一個術語,因爲後綴i ++評估爲0,但是遞增爲1.因此,i = 1並且j在j = -1處保持不變。 這裏最好的討論點是從不寫這樣的代碼,調試和合理化是非常棘手的。
Google for「短cicuit評價」 – wildplasser 2014-09-13 12:41:46
說明你自己對代碼的分析到目前爲止 – 2014-09-13 12:42:28
@afzalex你知道答案了嗎? – thumbmunkeys 2014-09-13 12:43:13