- #include <stdio.h>
- void main()
- {
- int i=5,j=5,p,q;
- p=(i++)+(i++)+(i++); // 这里 i 被视为 5, 运算结束后再自增变为 8
- q=(++j)+(++j)+(++j); // 这里 j 先自增为 8 在进行运算
- printf("%d,%d,%d,%d",p,q,i,j);
- }
注: 有的编译系统按照自左向右顺序执行括号内的运算, 求解完第 1 个括号的值后会实现 i 的自加, i 值变为 6, 再求第 2 个括号的值, 结果表达式相当于 6+7+8, 即 21. 而另外一些系统 (如 Turbo C 和 MS C) 把 3 作为表达式中所有 i 的值, 因此 3 个 i 相加, 得到表达式的值为 15. 在求出整个表达式的值后 i 变量再实现自加 3 次, i 的值变为 8.
5, 赋值运算和赋值表达式:(1)简单赋值运算符记为 "='. 由 "=" 连接的式子称为赋值表达式. 其一般形式为: 变量 = 表达式. 例如: x=a+b
赋值表达式的功能是计算表达式的值再赋予左边的变量. 赋值运算符具有右结合性. 因此 a=b=c=5 可理解为 a=(b=(c=5)).
(2)类型转换: 如果赋值运算符两边的数据类型不相同, 系统将自动进行类型转换, 即把赋值号右边的类型转换为左边的类型, 具体规定如下:
a, 实型赋予整型, 舍去小数部分;
b, 整型赋予实型, 数值不变, 但将以浮点形式存放, 即增加小数部分(小数部分值为零);
c, 字符型赋予整型, 由于字符型为一个字节, 而整型占两个字节, 故将字符的 ASCII 码值放到整型量的低八位中, 高八位为 0. 整型赋予字符型, 只把低八位赋予字符量.
例 6
- #include <stdio.h>
- void main()
- {
- int a,b=322;
- float x,y=8.88;
- char cl='k',c2;
- a=y; //a=y=8
- x=b; //x=b=322.000000
- a=cl; //a=y=cl='k'=107(ASCII 表中 107 为 k)
- c2=b; //c2=b=322=101000010(二进制)→字符型只存后八位 = 01000010=B(ASCII)
- printf("%d,%f,%d,%c",a,x,a,c2);
- }
(3)复合的赋值运算符: 在赋值符 "=" 之前加上其他二目运算符可构成符合赋值符. 如:+=,-=,*=,/=,%=,<<=,&=,^= 等.
例: a+=5 等价于 a=a+5,x*=y+7 等价于 x=x*(y+7)
符合赋值符这种写法, 对初学者可能不习惯, 但十分有利于编译处理, 能提高编译效率并产生质量较高的编译代码.
(6)逗号运算符和逗号表达式: 在 C 语言中逗号 "," 也是一种运算符, 称为逗号运算符, 其功能是把两个表达式连起来组成一个表达式, 称为逗号表达式. 其一般形式为: 表达式 1, 表达式 2;
其求值过程是分别求两个表达式的值, 并以表达式 2 的值作为整个逗号表达式的值.
例 7
- #include <stdio.h>
- void main()
- {
- int a=2,b=4,c=6,x,y;
- y=((x=a+b),(b+c)); // 注:= 的优先级比, 要高, 所以逗号表达式要记得加括号
- printf("y=%d,x=%d",y,x);
- }
注:(1)逗号表达式中的表达式 1 和表达式 2 也可以是又是逗号表达式. 例:(表达式 1,(表达式 2, 表达式 3));
(2)程序中出现逗号表达式通常是要分别求逗号表达式内个表达式的值, 并不一定要求整个逗号表达式的值.
(3)并不是所有出现逗号表达式的地方都组成逗号表达式, 如在变量说明中, 函数参考表中逗号只是用作各变量之间的间隔符.
来源: http://www.bubuko.com/infodetail-2894102.html