C语言的优先级、结合性和求值顺序

C语言的优先级、结合性和求值顺序,第1张

C语言的优先级、结合性和求值顺序

文章目录
    • 运算符的优先级
    • 运算符的结合性
    • *** 作数的求值顺序

运算符的优先级

优先级规定 *** 作数的组合方式,但注意:这并未说明运算符对 *** 作数的求值顺序。
运算符的优先级不是运算的优先级,而是组合的优先级。即:高优先级的运算符能结合的变量或表达式不能被低优先级的运算符分离。
有表达式: 1 * 2 + 3 * 4
已知乘号 * 的优先级是加号 + 的优先级高,那么根据优先级来划分组
有表达式: (1 * 2) + (3 * 4)

运算符的结合性
  • 定义:结合性规定了具有相同优先级的运算符如何进行分组。
  • 如有表达式: a = b = c = d 因为规定赋值语句的结合性是从右到左的,所以分组后为 (a = (b = (c = d)))
*** 作数的求值顺序

在C/C++中只有4个运算符被规定了 *** 作数的的计算次序,它们是&&,||,逗号运算符,条件运算符?:(且它们的求值顺序为:自左向右)

下面举例并说明 *** 作数的求值顺。
有表达式: (1 * 2) + (3 * 4)

按照习惯我们会这样计算:
(1 * 2) + (3 * 4)
= 2 + (3 * 4)
= 2 + 12
= 14
但是计算机也许是按照这样顺序计算的:
(1 * 2) + (3 * 4)
= (1 * 2)+ 12
= 2 + 12
= 14
计算机计算该表达式的顺序可能是第一种,也可能是第二种。这取决与编译器的规定。
将上述表达式一般化:
add = f 1 ( ) + f 2 ( )
那么编译器是会先调用 f 1 ( ) 还是 f 2 ( ) ?我们是不确定的,所以 结合性是确定 *** 作符的对象,并不是 *** 作数的求值顺序。
下面再举一个例子来理解 *** 作数的求值顺序:
有表达式: 1 + 2 * 3 + 4 由优先级和结合性: (1 + (2 * 3)) + 4
有以下可能的求值顺序:
(1): (2 * 3) —> 1 + (2 * 3) —> (1 + (2 * 3)) + 4
(2): 1 —> 1 + (2 * 3) —> (1 + (2 * 3)) + 4
(3): 4 —> (2 * 3) —>(1 + (2 * 3)) —> (1 + (2 * 3)) + 4

//作者:CCCPKeay
//时间:2021/11/03

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5116124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存