關於前置及後置++,--
a++ (
temp=a,a+=1,temp
) //
由此看出後置
++產生臨時變數
++a (a+=1,a)
所以在程式中出現a++=10,(a++)++,++(a++)
等試圖改變後置
++的值,是錯誤(編譯錯誤)的
前置及後置++
的用法
1.遇到逗號結束:
如:int a=10;
int c=(a++,++a,a++);
printf("%d\n",c);
在vc6
中列印c
的值為12,
這裡的(a++,++a,a++);
為逗號表示式,從左向右運算,遇逗號後置
++進行加法運算,運算後表示式為(
10,12,12);
所以c的值為12 2.
遇到;結束:
printf("%d %d %d \n",a++,++a,a++); 列印
11 11 10
所有的函式引數屬於一條語句,不是逗號表示式,從右向左入棧 3.
在巨集中的使用
int a=10;
int b=10;
#define return_value1(a,b) (a++>b?a++:b)
#define return_value2(a,b) (++a>b?a++:b)
int c=0;
c=return_value1(a,b);
printf("%d\n",c); 列印10
c=0;
c=return_value2(a,b);
printf("%d\n",c); 列印11
4.在陣列中的使用
int array=;//10,12,12
這裡的表示式是逗號表示式,從左向右計算
容易出錯的地方
int a=10;
a++=10;
printf("%x\n",&a++);
(a++)++;
++(a++);
++a++; //++從右向左結合,所以相當於
++(a++).
以上表示式均是錯的。
切記:內建型別產生的臨時量具有常性,而這裡的後置++
產生臨時量,所以不能為其賦值,取位址,或改變它的值。
printf("%d\n",a+++++b);
編譯錯誤,因為編譯器從左往右結合最長的有效運算子,a+++++b
經過編譯器結合後變為
a++ ++ +b
這顯然是錯的,
++單目運算子,所以運算時先掃瞄乙個運算元,而此時中間的
++掃瞄不到乙個運算元,所以出錯,應將表示式改為
printf("%d\n",a++ + ++b);
即可。
printf("%d\n",a-----b);理由同上。
前置及後置--
的使用與前置及後置
++的使用相類似,所以在這裡省略。
註明:這裡所有的情況都是在32
為作業系統下
32為編譯器下的情況
前置 和後置 過載
1 前置 過載時沒有引數 而後置 過載時有引數。不會使用其引數,僅僅是區分用。可以理解為前置 後面有引數了,所以不需要引數 i 對應 operator i 對應 operator int 2 前置 需要返回引用 因為過載自加運算子後可以返回物件的引用,以方便在表示式中連續使用。而後置 返回的不是引用...
過載 前置 與後置
過載 前置 與後置 不同於普通的雙目運算子 自增自減運算子 在過載的時候需要額外留意區分是前置式還是後置式。現行的處理方法是,作為成員函式的 前置 不接受任何引數,而後置 接受乙個int型別的引數,儘管沒什麼實際用途,但是卻為編譯器確定過載物件提供了幫助。除了區分的時候需要注意,他們的行為也是有所區...
pytest的前置後置
setup module teardown module 函式形式,前置動作 用例1 用例2 用例3 後置動作 setup function teardown function 函式形式,每個用例執行前後,都會執行前置後置,即前置動作 用例1 後置動作 前置動作 用例2 後置動作 setup cla...