background image

在:使程序费解,并易于发生误解或错误。例如,当 i=3 时,表达式(i++)+(i++)+(i++)的值

为多少,各种教材说法不统一。对于这种情况,为了增强程序的可读性与可移植性,

在一个表达式中,就应该用简单的自增与自减运算,不用对同一变量进行多次自

增自减运算的表达式,否则,其他人可能看不懂,换个运行环境也可能是不同的

结果。我相信,在考试试题中也是不会出现象这种有不同结果的试题的,请读者放

心。当然,为了丰富知识,了解一下这些内容也是必要的。

以下内容是经查阅资料所得:用各种表达式上机测试,给出 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.

4

 

、 前后缀混合的情况:

(1) 一般情况:表达式中自左向右计算,参数自右向左运算。前缀自增后取值;

后缀(或变量)取值依其所处位置而定,有连续多个将统一取值,其自增在语句

结束前进行。

(2) 前后缀各有一个的情况:设 int i=5; 由于 i++*++i 应满足交换率与++i*i++相同,

规定按后者计算故为 36。实验 内容 4int i=5; printf("%d,%d\n", --i, i++*++i ); 打印

536

(3) 若 i++++i 或两者有多于一个的情况:++i 有两个以上在一起时最左边的连

续自增同 3、,其余每个自增后取值,如:int i=5;

printf("%d\n%d\n",--i,(++i)+(i++)+(i++)+(++i)); 打印 和 25

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+(++i)+(i++)); 打印 和 40

printf("%d\n%d\n",--i,(++i)+(++i)+(++i)+i+(++i)+(++ i)); 打印 和 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