標準沒有規定C C 表示式求值順序

2021-09-21 03:37:48 字數 796 閱讀 5070

對於表示式,標準並沒有規定計算順序,所以下列**的執行結果存在多樣性:

#include stdio.h>

int main()

vc 6.0: m=4, n=7

vc 2013: m=4, n=9

gcc 4.1.2: m=4, n=7

gcc 4.6: m=4, n=7

gcc 4.7: m=4, n=7

gcc 4.7 (c++11): m=4, n=7

gcc 4.8: m=4, n=9

gcc 4.8 (c++11): m=4, n=9

gcc 4.9: m=4, n=9

gcc 4.9 (c++11): m=4, n=9

gcc 4.9 (c++14): m=4, n=9

clang 3.5: m=4, n=8

clang 3.5 (c++11): m=4, n=8

clang 3.5 (c++14): m=4, n=8

c語言標準的第81頁(6.5節,不同版本的標準會有些差異,可直接搜尋「

i = ++i + 1」)摘要:

74) this paragraph renders undefined statement expressions such as

i = ++i + 1;

a[i++] = i;

while allowing

i = i + 1;

a[i] = i;

相關參考:

例如 i = i+1 合法, 而 a[i] = i++ 則非法,c標準強烈宣告它是無定義的)

c 表示式求值順序

今天寫了乙個搜尋函式,碰到了乙個有關表示式求值順序的bug,看下面兩段 這是為乙個向量寫的乙個搜尋函式,輸入乙個值,然後返回這個值在向量中的秩rank,如果該值在向量中存在多個,返回最大的,找不到返回 1 template rank yvector find const t e const temp...

表示式(二) 求值順序

基於 c primer p123 1.求值順序 優先順序 結合律 對於 f g h j 1 優先順序規定 g 的返回值於 h 的返回值相乘。2 結合律規定 f 的返回值先於 g 和 h 的乘積相加,隨後與 j 的返回值相加。3 對於這些函式的呼叫順序沒有規定。因此,若其中某幾個函式影響同一物件,就是...

關於C C 表示式求值順序 未定義

這篇文章講的真好!對於 expr1 expr2 其中expr1,expr2都可能是復合表示式 不同的編譯器想先算exp1就先算exp1,想先算exp2就先算exp2。而且,編譯器不必保證exp1計算完畢之後才去計算expr2,它可以這麼做,也可以不這麼做。c語言標準裡並不做規定。一段正常的程式不應該...