/*C 語言有這樣一個規則:每一個符號應該包含儘可能多的字元*/
int i = j = 0;
/* 1. ++i++ means (++i)++. (++i)++ == 1, i == 2; ++i++編譯不通過,必須加上括弧
2. (++i)+++i means ((++i)++)+i. The value of the statement is 2, i == 2;
3. (++i)+++i++ means ((++i)++)+(i++). The value of the statement is 2, i == 3;
4. (++i)+++i+++i means ((++i)++)+(i++)+i.The value of the statement is 3, i == 3;
*/
/*C 語言有這樣一個規則:每一個符號應該包含儘可能多的字元*/
printf("(++i)+++i+++i = %d\n", (++i)+++i+++i); //the result is 3
printf("i = %d\nj = %d\n\n", i, j); //i = 3, j = 0;
完整程式
#include <stdio.h>
int main()
{
/////////////////j = (i++, i++, i++);//////////////////////////
int i = 0, j = 0;
j = (i++, i++, i++); //逗號運算式,i 在遇到每個逗號後,認為本計算單位已經結束,i 這時候自加
printf("i = %d\nj = %d\n\n", i, j); //i = 3, j = 2;
//////////////////////////////////////////////////////////////
i = j = 0;
printf("i = %d\nj = %d\n\n", i, j); //i = 0, j = 0;
/////////////////j = (++i, i++, i+10);/////////////////////////
i = 3;
j = (++i, i++, i+10);
printf("i = %d\nj = %d\n\n", i, j); //i = 5, j = 15;
//////////////////////////////////////////////////////////////
for(i = 0; i < 10 && printf("i1 = %d\n", i); i++, printf("i3 = %d\n\n", i))
{
printf("i2 = %d\n", i);
}
//////////////////////////////////////////////////////////////
i = j = 0;
j = (i++) + (i++) + (i++); //i遇到分號才認為本計算單元結束,i這時候自加
printf("i = %d\nj = %d\n\n", i, j); //i = 3, j = 0;
///////////////////////i+++j//////////////////////////////
i = j = 0;
printf("i+++j = %d\n", i+++j); //i+++j means i++ + j;
printf("i = %d\nj = %d\n\n", i, j); //i = 1, j = 0;
///////////////////////////////////////////////////////////
i = j = 0;
/* 1. ++i++ means (++i)++. (++i)++ == 1, i == 2; ++i++編譯不通過,必須加上括弧
2. (++i)+++i means ((++i)++)+i. The value of the statement is 2, i == 2;
3. (++i)+++i++ means ((++i)++)+(i++). The value of the statement is 2, i == 3;
4. (++i)+++i+++i means ((++i)++)+(i++)+i.The value of the statement is 3, i == 3;
*/
/*C 語言有這樣一個規則:每一個符號應該包含儘可能多的字元*/
printf("(++i)+++i+++i = %d\n", (++i)+++i+++i); //the result is 3
printf("i = %d\nj = %d\n\n", i, j); //i = 3, j = 0;
////////////////////////////////////////////////////////////
i = j = 0;
printf("(i++)+(++j) = %d\n", (i++)+(++j)); //The result is 1. i+++++j is wrong, because it means ((i++)++)+j, the second ++ has no left value.
printf("i = %d\nj = %d\n\n", i, j); //i = 1, j = 1;
return 0;
}
VC++環境下連續自增(自減)運算規則
1、 在一般運算式中和在函數參數中計算的結果相同(這一點與Turbo C環境不同);
2、 尾碼:同運算式中Turbo C的情況相同:先統一取值後依次自增,如:
int a,i=5; a=i+++i+++i++; a=15, i=8.
3、 首碼:對整型,前兩個自增同Turbo C,即依次自增後統一取值,後面的每個自增後即
取值,如:
int a, i=5; a= ++i +(++i)+(++i); a=22, i=8.
對實型,每個自增後即取值,如:
float a, i=5; a= ++i +(++i)+(++i); a=21, i=8.
4、 前尾碼混合的情況:
(1) 一般情況:運算式中自左向右計算,參數自右向左運算。首碼自增後取值;尾碼(或變數)取值依其所處位置而定,有連續多個將統一取值,其自增在語句結束前進行。
(2) 前尾碼各有一個的情況:設int i=5; 由於i++*++i應滿足交換率與++i*i++相同,規定按後者計算故為36。實驗2內容4:int i=5; printf("%d,%d\n", --i, i++*++i ); 列印5,36。
(3) 若i++或++i或兩者有多於一個的情況:++i有兩個以上在一起時最左邊的連續自增同3、,其餘每個自增後取值,如:int i=5;
printf("%d\n%d\n",--i,(++i)+(i++)+(i++)+(++i)); 列印6和25
printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+(++i)+(i++)); 列印8和40
printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+i+(++i)+(++ i)); 列印9和49
(4) 函數參數中有括弧時,括弧參數優先計算,其餘參數仍自右向左計算,如:
int i=9,j=8; printf("%d %d\n", (++i, j--), ++i); 列印8 11
printf("%d %d %d\n", (++i, j--), ++i, i); 列印8 11 10
(5) 最後i的值等於原值加總自增次數減自減的次數
原始地址:http://helloouc.blog.163.com/blog/static/5530527120122219254638/