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

zen*_*nna 8 c++ operator-precedence logical-operators

和&&运算符评估的顺序是什么

例如以下代码

if (float alpha = value1-value2 && alpha > 0.001)
    //do something
Run Code Online (Sandbox Code Playgroud)

提出了一个例外,即在没有启动的情况下使用alpha.我认为&&的左边的表达式总是首先启动alpha的值,但似乎我可能错了

任何的想法?

谢谢

Kor*_*icz 13

这被解析为:

if (int alpha = (value1-value2 && (alpha > 0.001)))
Run Code Online (Sandbox Code Playgroud)

...因为&&它具有更高的"解析优先级"而不是=- 这可能不是你想要的.尝试:

int alpha = value1-value2; 
if (alpha && (alpha > 0.001))
Run Code Online (Sandbox Code Playgroud)

  • 您不能在子表达式中声明.您的"尝试"版本无效. (4认同)
  • `if(alpha> 0.001)`做同样的事情 (2认同)

AnT*_*AnT 11

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

其他答案已经向你解释过你的条件没有按你认为解析的方式解析,尽管很多答案在引用=运算符在条件中的优先级时会出现明显的错误,而实际上在那里没有任何=运算符.正确的解释是,当你在if条件中声明一个变量时,语法是带有初始化器的声明,所以整个过程的解析方式与

int alpha = value1 - value2 && alpha > 0.001;
Run Code Online (Sandbox Code Playgroud)

将被解析,即它是一个int alpha初始化的声明value1 - value2 && alpha > 0.001.它里面没有操作员=.我希望你现在可以看到编译器为什么在初始化表达式中读取未初始化的变量.编制者将对以下声明提出同样的投诉

int alpha = alpha; // reading uninitialized variable
Run Code Online (Sandbox Code Playgroud)

出于同样的原因.

要实现您真正想要表达的内容,您必须预先声明alpha

int alpha;
if ((alpha = value1 - value2) && alpha > 0.001) {
  // whatever 
}
Run Code Online (Sandbox Code Playgroud)

或分成if两部分

if (int alpha = value1 - value2) 
  if (alpha > 0.001) {
    // whatever 
  }
Run Code Online (Sandbox Code Playgroud)

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

int alpha = value1 - value2;
if (alpha > 0.001) {
  // whatever 
}
Run Code Online (Sandbox Code Playgroud)

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

int alpha = value1 - value2;
if (alpha > 0) {
  // whatever 
}
Run Code Online (Sandbox Code Playgroud)