a[i]=i++;
的聲明是不確定的,因爲有一個混淆,即i
(舊的或新的)值用於評估左側以獲得L-value
。如果使用-Wall
進行編譯,此編譯器將給出警告(操作..可能未定義)。爲什麼在C中提到的代碼是未定義的行爲
在下面的代碼,在聲明中x->a = x->b, ++x++->b;
x
正在被改變,並在左側用它來獲得L-value
。對於這個語句,如果使用-Wall
執行,編譯器不會給出任何警告。
有人能解釋爲什麼這不是未定義的行爲? 謝謝!
struct Data {
int a;
int b;
} y[4] = { 10, 20, 30, 40};
struct Data *x = y;
int i;
for(i=0; i<2; i++) {
x->a = x->b, ++x++->b;
printf("%d %d\t", y[i].a, y[i].b);
}
僅僅因爲編譯器沒有警告,並不意味着這個行爲真的很好定義。 –