可能重複:
Undefined Behavior and Sequence Points會「p = p +(* p)++ * 3 + c;」導致未定義的行爲?
如在標準中定義,E1 + E2 =幾乎相同於E1 = E1 + E2除了E1只計算一次。所以,另外,會「p + =(* p)++ + c」;導致未定義的行爲?
在gcc/g ++(4.7/4.4)中嘗試下面的代碼。有2種結果:bxxxxx(g ++ 4.7)或axbxxx(gcc,g ++ 4.4)。如果我們在代碼中執行(1)而不是(2),我們只能得到axbxxx。
#include <stdio.h>
int main() {
char s[] = "axxxxx";
char *p = s;
printf("s = %s in the beginning.\n"
"p is pointed at the %d-th char.\n", s, p - s);
//p = p + (*p)++ * 3 + 2 - 'a' * 3; // (1)
p += (*p)++ * 3 + 2 - 'a' * 3; // (2)
printf("p is moved ahead by %d steps\n", p - s);
printf("s = %s after the operation.\n", s);
return 0;
}
我找不到爲什麼它會導致未定義的行爲,我也不能斷言它是一個gcc的錯誤。
對於axbxxx結果,我也不明白爲什麼操作數或後++被評估兩次(一旦獲取值,並稍後保存它)。由於在標準中說「1 ...被添加到它」,我認爲地址應該只被評估一次。如果post ++的操作數的地址只被求值一次,表達式的效果將是相同的,儘管以任何順序執行分配。
=== UPDATE ===
讀取第一個註釋鏈接的文檔後,我想下面的規則可能無關緊要:
「2)此外,前值應只訪問確定要存儲的值。「 。因此,「p = p +(* p)++ * 3 + c」中p的訪問是否被認爲是* p的「先值」的一部分,與要求的值無關存儲在* p?
IMO,這條規則沒有違反。
檢查[this](http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points)。 – detunized
感謝您的好文件。 –
G ++的行爲更改爲4.7 by http://gcc.gnu.org/viewcvs?view=revision&revision=176072 –