這個問題在這里已經有了答案: 為什么這些構造使用前增量和后增量未定義的行為? (14 個回答) 函式引數中預增量和后增量的操作順序?[重復] (4個答案) 函式引數求值順序 (5個回答) 1 小時前關閉。
我是 C 的新手,我正在寫一些簡單的東西來熟悉。我只是嘗試對陣列索引進行預增量,而我得到的確實不是我所期望的。
有問題的代碼:
#include <stdio.h>
int main()
{
int array[5] = {1,2,3,4,5};
int i = 0;
printf("%d %d",array[i], array[ i]);
return 0;
}
應該顯示 array[0] 和 array[1] 的元素,對嗎?但它沒有,因為輸出是2 2
我錯過了什么?
uj5u.com熱心網友回復:
事情是這樣的:你不能保證在什么 order 函式引數中求值。
這意味著,在您的 printf 呼叫中,無法判斷是先評估 array[i] 還是 array[ i]。在您的情況下,似乎 array[ i] 贏了,所以發生的情況是您最終列印了 array[1] 兩次。
uj5u.com熱心網友回復:
這不是一個很好的使用預增量。
如果您想查看array[i]and array[i 1],請執行以下操作:
printf("%d %d\n", array[i], array[i 1]);
請記住,i 不只是將i' 的舊值加 1。它取i' 的舊值,然后將其加 1,然后將新值存盤回i. 當你列印array[i]andarray[i 1]時,你真的想改變 的值i嗎?
如果您確實想更改 的值i——或者無論如何,既然提到array[i ] 確??實改變了 的值i——你就引入了undefined behavior。一旦你有了一個修改 的值的運算式,i你怎么知道array[i]會列印什么?你怎么知道array[i]最終不會使用 的新值i?您可能假設事物是從左到右評估的,但事實證明這不一定是正確的。如此奇怪,奇怪的事情會發生。
這是一個有助于展示如何作業的示例 ,并且定義明確:
#include <stdio.h>
int main()
{
int array[5] = {1,2,3,4,5};
int i = 1;
array[i ] = 22;
array[ i] = 44;
for(i = 0; i < 5; i )
printf("%d: %d\n", i, array[i]);
return 0;
}
或者,正如您在評論中所建議的那樣,如果您確實想修改i's 的值,也許是為了沿陣列推進變數i,您有時必須注意將 's 移到i 單獨的陳述句中。簡單的規則是,如果您將 或--應用于變數,則只能在同一陳述句中使用該變數一次。所以你不能有i i ,因為里面有兩個i,而且它們都被修改了。但是你也不能擁有i i , or f(a[i], a[i ]),因為它們有一個你修改i的地方,一個你使用的地方i,并且沒有辦法知道你是使用舊值還是新值i。(而且,再一次,在 C 中沒有一般的從左到右的規則可以幫助你。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523643.html
標籤:C
上一篇:在線法官一直告訴我有錯誤的答案
下一篇:將表檔案讀入C中的陣列
