以下C代码片段(其中a
和b
都是double
类型)就是我的问题所在:
if(1.0-a < b && b <= 1.0)
根据Wikipedia中显示的操作顺序,我理解这与以下带括号的代码段一样进行评估:
if( ( (1.0-a) < b ) && ( b <= 1.0) )
这就是我想要的。我只想仔细检查我的理解,即两个代码片段确实等同于C中的操作顺序。
注意:显然我可以使用第二个代码段并明确我想要if()
进行评估的内容;我问,因为我已经在我的代码中使用了第一段代码,我想确保我之前的代码结果没问题。
答案 0 :(得分:4)
快速回答:是的,它是等效的。
这意味着两个代码段的结果是相同的;意思是一样的,但是当你谈到操作顺序时要小心。在我看来,这里的问题是关于优先级和关联性。后者告诉你表达式意味着什么,而不是它的操作数的评估顺序。要了解评估顺序,请阅读序列点:Undefined behavior and sequence points
答案 1 :(得分:4)
你问的是“操作顺序”,但我认为这不是你真正想知道的。
短语“操作顺序”是指执行操作的时间顺序。在大多数情况下,未指定在表达式中执行操作的顺序。 &&
运算符是少数例外情况之一;它保证在其右操作数之前计算其左操作数(并且可能根本不评估右操作数)。
您添加的括号可以影响哪些操作数与哪些运算符相关联 - 是的,这两个表达式
1.0-a < b && b <= 1.0
和
( (1.0-a) < b ) && ( b <= 1.0)
是等价的。
括号可用于覆盖运算符优先级。它们通常不会影响运算符的评估顺序。
一个例子:这个:
x + y * z
相当于:
x + (y * z)
因为乘法的优先级高于加法。但是,可以在6种可能的顺序中评估三个操作数x
,y
和z
:
x, y, z
x, z, y
y, x, z
y, z, x
z, x, y
z, y, x
在这种情况下,顺序没有区别(除非其中一些是volatile
),但如果它们是具有副作用的子表达式则可能很重要。