c语言表达式是什么的结合,C语言条件表达式(三目运算符)结合性问题

在C语言标准中规定:条件表达式(三目运算符)的结合性是右结合,即自右向左结合

比如下面这条语句

int i = -2;

int n = ++i == 0 ? 99 : i == -1 ? 11 : 22;

问题是:n的值是多少?

一般理解,根据上面的表达式以及结合性,n的求值语句等价于

int n = ++i == 0 ? 99 : (i == -1 ? 11 : 22);

这时问题就出现了,有些人会对后面括号中的表达式先进行运算,得到结果为22,然后再计算整个表达式,最终得到的结果是 n = 22。

但是运行结果却是 n = 11,这是为什么呢?

究其原因,实际上就是将运算符的结合性与表达式的运算顺序这两个概念弄混了。

就上面这个语句来说,运算符的右结合性只是说明这个表达式等价于

int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

而不是

int n = (++i == 0 ? 99 : i == -1) ? 11 : 22;

结合性仅仅是定义了多个相同优先级的运算符和与之相关的操作数(操作符)的结合顺序,而并没有规定那个子表达式先运行。

换一种说法,结合性和优先级只是定义表达式的结构,当确定表达式运行时的行为时才需要表达式各部分的运算顺序。

C语言对于大多数的运算符没有规定运算顺序,只明确规定了条件表达式(三目运算符)、逻辑与 &&、逻辑或 || 以及逗号运算符的运算顺序(看到逻辑与&& 和 逻辑或 || 运算符是不是想到了什么?对,就是“短路求值”!)。

C语言对于条件表达式(三目运算符)的运算顺序规定为:条件表达式首先对条件部分求值,若条件部分为真,则对问号之后冒号之前的部分求值,并将求得的结果作为整个表达式的结果值,否则对冒号之后的部分求值并作为结果值。

再回到之前的问题看一下,了解了吧~~

总结一下:C语言编译器对于一个表达式进行编译处理时,首先需要确定表达式的结构,这时用到了运算符的优先级和结合性,然后再确定表达式运行时的行为(表达式各部分的运算次序)这里用到了运算符的运算顺序(求值顺序)。

这里需要理解的重点就是优先级、结合性、表达式各部分的运算顺序是不同的概念!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值