&& amp;的哪一侧(左侧或右侧) (和)运算符在C ++中进行评估

时间:2010-01-20 16:20:41

标签: c++ logical-operators operator-precedence

和&&运营商评估

例如以下代码

if (float alpha = value1-value2 && alpha > 0.001)
    //do something

抛出了一个例外,即在没有启动的情况下使用alpha。 我以为&&&总会首先启动alpha的值,但似乎我可能是错的

有什么想法吗?

由于

14 个答案:

答案 0 :(得分:13)

将其解析为:

if (int alpha = (value1-value2 && (alpha > 0.001)))

...因为&&具有比=更高的“解析优先级” - 这可能不是您想要的。尝试:

int alpha = value1-value2; 
if (alpha && (alpha > 0.001))

答案 1 :(得分:11)

这里的底线是,你试图表达的内容不可能由一个逻辑条件表达,alpha的声明被嵌入其中(尽管其他一些答案声称)。

其他答案已经向你解释过你的条件没有按照你认为解析的方式进行解析,尽管许多答案明显错误地指出=运算符在条件中的优先级,而实际上那里没有=运营商。正确的解释是,当您在if条件中声明变量时,语法是使用初始化程序进行声明的语法,因此整个过程的解析方式与

相同。
int alpha = value1 - value2 && alpha > 0.001;

将被解析,即它是int alphavalue1 - value2 && alpha > 0.001初始化的声明。其中没有运算符=。我希望你现在可以看到编译器为什么在初始化表达式中读取未初始化的变量。编制者将对以下声明提出同样的投诉

int alpha = alpha; // reading uninitialized variable

出于同样的原因。

要实现字面尝试表达的内容,您必须预先声明alpha

int alpha;
if ((alpha = value1 - value2) && alpha > 0.001) {
  // whatever 
}

或将if拆分为两个

if (int alpha = value1 - value2) 
  if (alpha > 0.001) {
    // whatever 
  }

但是,由于第二个条件已经要求alpha大于0,所以即使验证第一个条件也没有多大意义,所以最有意义的事情是只是减少整个事情

int alpha = value1 - value2;
if (alpha > 0.001) {
  // whatever 
}

当然,正如其他人已经指出的那样,int值与0.001的比较是有效的,但却很奇怪。只是做

int alpha = value1 - value2;
if (alpha > 0) {
  // whatever 
}

答案 2 :(得分:4)

始终首先评估左侧。这里的问题是运算符优先级。看看这是否效果不好:

if ((int alpha = value1-value2) && (alpha > 0.001))

答案 3 :(得分:2)

在澄清其工作原理后(出于教育目的),不要这样做。不要在同一语句中混合变量初始化/赋值和比较。

如果每个语句单独是“命令”或“查询”,那就更好了。

如果“if”中的条件非常清晰可读,并且毫不含糊,那就更好了。不是整数,没有什么,只是布尔。

条件的第一部分是整数。然后你做一个和一个布尔。你根本不需要强制进行转换。 给出if和条件运算符完全符合它们的要求:bools。

答案 4 :(得分:2)

回答标题中的问题,取决于操作数的类型

对于内置类型,&&短路,意味着评估LHS,如果它是假的,则根本不评估RHS。

对于过载operator&&的用户定义类型,它不会短路。以未指定的顺序对双方进行评估,然后调用该函数。

我认为其他人已经处理了你需要回答的问题。

答案 5 :(得分:1)

如果我没弄错的话,那个操作是不确定的。在一个语句中指定变量然后引用同一个变量是未定义的。

答案 6 :(得分:1)

我通常总是使用括号来使我的代码更清楚我的意图。

答案 7 :(得分:1)

从左到右进行评估。

在你的情况下,然而,赋值是最后发生的事情,它们的整个行为将表现为(其中alpha用作计算的一部分以获得结果以初始化它):

if (int alpha = (value1-value2 && alpha > 0.001))

您不能将变量声明混合到复杂表达式中,因此以下内容不会编译:

if ((int alpha = value1-value2) && (alpha > 0.001))

因此,您需要将其分成两行:

int alpha = value1 - value2;
if (alpha > 0.001)

答案 8 :(得分:1)

if (int alpha = value1-value2 && alpha > 0.001)

根据the rules,将按顺序进行评估

1.  (value1-value2)   [evaluate subtraction]
2.  && (left side)    [test left side]
3.  (alpha > 0.001)   [evaluated only if value-value2 != 0]
4.  && (right side)   [test right side]
4.  alpha =           [assignment]

在步骤3中,首先评估alpha。由于它尚未被分配 - 也许未被声明,因此规则不明确 - 它会产生错误。

缺陷是赋值的优先级低于&&。什么仍然无效,但更接近:

if (int alpha = value1-value2, alpha > 0.001)

Gcc提供error: expected expression before ‘int’。好吧也许它不会更近。在最初的声明中,gcc也说了同样的话。

答案 9 :(得分:0)

我的猜测是因为你在“if”语句中声明了存储空间。我甚至认为不会编译。

试试这个。

int alpha;
if ((alpha=value1-value2) && alpha>0.001)

但我认为这不是你所需要的。您将alpha作为int,然后将其与浮点值进行比较。和&&只要alpha不为零,语句就会返回true,如果alpha大于0,则第二部分将返回true。所以你应该这样做

int alpha;
if ((alpha=value1-value2)>0)

或更易读的代码

int alpha=value1-value2
if (alpha>0)

但要回答你原来的问题:&&当答案很明显时,从左到右执行并短路。即,如果&& amp;的第一部分。是假的,第二个甚至没有被评估!

答案 10 :(得分:0)

这是一篇文章listing operator precedence and associativity

据我所知,你的意图是声明一个临时的,为它赋值value1-value2,然后测试结果并输入if块,如果它大于某个值。 alpha被声明为int,但您似乎将它与double进行比较。 alpha应该是双倍的。

你在使用临时工时很有创意。清晰通常比可爱更好。这样做:

double alpha = value1-value2;
if (alpha > 0.001)

答案 11 :(得分:0)

根据: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

- LtR
> LtR
&& LtR
= RtL

给出你的例子

(int alpha = value1-value2 && alpha > 0.001)
(int alpha = (value1-value2) && alpha > 0.001)
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = (value1-value2) && (alpha > 0.001))
(int alpha = ((value1-value2) && (alpha > 0.001)))

答案 12 :(得分:0)

如上所述,此表达式执行以下操作:

  1. 评估value1 - value2并通过与零进行隐式比较将其转换为bool,即它实际上是(value1 - value2) != 0
  2. 在将alpha > 0.001截断为0.001后评估int(0)此时alpha未初始化。
  3. 计算前两次评估的逻辑AND
  4. 逻辑AND 的布尔结果转换回整数
  5. 我认为这总结了其他帖子。我发布单独答案的唯一原因是我找不到在alpha未初始化时提及的所有内容以及此处发生的所有转换; wallyk's answer最接近。

    当然,其他答案表明您使用括号和单独的alpha声明正是您应该采取的措施来解决这个问题。在if语句中声明变量是我没有很好用的语言的一部分 - 重复结构中的声明似乎更合适。

答案 13 :(得分:-1)

问题是该声明正在评估如下:

if (int alpha = (value1-value2 && alpha > 0.001))

使用括号来修复&&amp ;;的左右两侧。操作者:

if ((int alpha = value1-value2) && (alpha > 0.001))