《C现代方法》第四章:表达式

人不是通过用计算器学会的计算,但却是靠此手段忘记了算术。

 

复合赋值运算符一例

 

运行程序屏幕输出的是什么数字?

是 14  .

说明复合赋值运算符的优先级低于 + 运算符, x *= a + b 等价于 x = x*(a + b);

 

 

连续赋值一例:

 

 

运行程序屏幕输出的是什么?

是 6 6.000000  

将浮点数6.8赋值给整数a,发生类型转换,a 的值是 6.然后把a的值赋给 b ,整型转换成浮点型,得 6.0 

 

运算符的优先级和结合性

 

当两个或更多的运算符出现在同一个表达式中时,我们先确定各个运算符的优先级,优先级最高的最先运算。同级的运算符看结合性。

结合性分左结合和右结合。

左结合即在同级运算中从左向右运算。

比如对于同级的二元运算符+、—就是左结合性,有:

i + j — k 等价于 (i + j)— k。

 

部分C语言运算符表

优先级           类型名称              符号               结合性

 

1               (后缀)自增            ++               左结合

                 (后缀)自减            ——             

 

2              (前缀)自增            ++               右结合

                (前缀)自增            ——              

                   一元正号                +                

                   一元负号                —        

 

3                  乘法类                 *  /  %          左结合

 

4                  加法类                  +  —            左结合

 

5                   赋值             =  *=  /=  +=  -=  右结合

 

如:

 

a = b += c++ - d + --e / -f

 

我们用圆括号来展示运算顺序即:

 

 

a = b += (((c++) - d) + ((--e) / (-f)))

由于C语言没有定义子表达式的求值顺序(除逻辑、条件、逗号运算符,后面要讲到),可能会因为使用的编译器不同而得到不同结果的例子:
a = 5;
c = (b = a + 2) - (a = 1);
使用后缀形式的++或--时,何时执行自增或自减操作?
C语言介绍了 “顺序点”的概念,并且提到“在前一个顺序点和下一个顺序点之间应该对存储的操作数的值进行更新”。
在C语言中,有各种不同类型的顺序点,语句是其中一种。到语句末尾,必须已经执行完所有语句中的自增和自减操作,只有在满足这些条件的情况下才能执行下一条语句。
但是,在这条语句内部何时执行呢?
如:
i = 1;
j = i ++  +  i++;
在执行完第二条语句时,i应该已经自增了两次。但是不知道这两次自增是在i自增之后(给 j 的值为 2 ),还是在其中一个 i 先行自增之后(给 j 的值为 3)。
避免方法就是在调用前执行++或--。
如:
i = 1;
i ++;
i ++;
j = i + i;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值