检查C'中的操作顺序是否'声明

时间:2014-05-12 22:31:49

标签: c if-statement

以下C代码片段(其中ab都是double类型)就是我的问题所在:

if(1.0-a < b && b <= 1.0)

根据Wikipedia中显示的操作顺序,我理解这与以下带括号的代码段一样进行评估:

if( ( (1.0-a) < b ) && ( b <= 1.0) )

这就是我想要的。我只想仔细检查我的理解,即两个代码片段确实等同于C中的操作顺序。

注意:显然我可以使用第二个代码段并明确我想要if()进行评估的内容;我问,因为我已经在我的代码中使用了第一段代码,我想确保我之前的代码结果没问题。

2 个答案:

答案 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种可能的顺序中评估三个操作数xyz

x, y, z
x, z, y
y, x, z
y, z, x
z, x, y
z, y, x

在这种情况下,顺序没有区别(除非其中一些是volatile),但如果它们是具有副作用的子表达式则可能很重要。