函式呼叫與自增運算

2021-09-26 18:34:22 字數 1683 閱讀 6497

最近寫**的時候本想著用點小trick,結果一不小心踩了個坑。

乙個例子:

#include

intmain()

用gcc編譯,-wall開啟warning,輸出如下,顯然這種在函式呼叫的引數中使用自增運算是不太好的做法,may be undefined:

test.c: in function 『main』:

test.c:7:28: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", id++, id++)

; ^

test.c:8:22: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", id++, id)

; ^

test.c:9:26: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", id, id++)

; ^

test.c:10:26: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", ++id, ++id)

; ^

test.c:11:24: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", id, ++id)

; ^

test.c:12:20: warning: operation on 『id』 may be undefined [-wsequence-point]

printf(

"%d,%d\n", ++id, id)

; ^

執行輸出是:

1,0

2,34,3

6,67,7

8,88

具體的分析參考:

函式引數進棧以及自增運算在函式呼叫中的trick

c語言 printf函式對引數的計算順序自加自減的討論

需要注意這麼幾點:

1.函式呼叫時引數的入棧順序,從右到左。

2.字首式和字尾式的區別

1.為了與內建型別一致,字首式操作符應返回被增量或減量物件的引用

2.為了與內建型別一直,字尾式操作符應返回舊值(即,尚未自增或自減的值),並且,應作為值返回,而不是返回應用。

3.在不同的編譯器中可能會得到不同的結果,例如vc++6.0後自增運算是要在整條語句結束以後才自加1的。

4.c++中, 字首式自增(或自減)可以用來當做左值使用,但是字尾式自增(或自減)不能被當做左值使用。

自增與自減運算

自增與自減運算 自增與自減主要有以下兩種作用 1 無論是前置 後置,都是自身變數加1,都是變數減1 2 當作為表示式時,前置和後置就有區別了。前置運算子的結果是加1或減1之後的結果,前置運算子的結果是加1或減1之前的結果。下面通過乙個簡單的程式進行說明 include using namespace...

自增與自減運算子

include int main 注意 無論是a 還是 a都等同於a a 1,在表示式執行完畢後a的值都自增了1,無論是a 還是 a都等同於a a 1,在表示式執行完畢後a的值都自減少1 c程式為邏輯逐行運算,遂值在逐行運算後 不斷在變化,只是區別與輸出與否。自增自減運算 字尾自增 x i x i ...

自增與自減運算子

例1 int a 1 int c 1 int a1 a system.out.println a a a1 a1 執行時的結果 a1 1 a 1 1 2 int b a system.out.println a a b b 執行時的結果 a 2 1 3 b 3 int c1 c system.out...