在C ++中评估的&&(和)操作员的哪一侧(左或右)
-
21-09-2019 - |
题
哪个订单是评估的和&&操作员
例如以下代码
if (float alpha = value1-value2 && alpha > 0.001)
//do something
抛出了一个例外,即在不被启动时使用了α。我以为&&剩下的表达总是会首先启动alpha的价值,但似乎我可能错了
任何想法?
谢谢
解决方案
这被解析为:
if (int alpha = (value1-value2 && (alpha > 0.001)))
... 因为 &&
比“解析优先”比 =
- 这可能不是您想要的。尝试:
int alpha = value1-value2;
if (alpha && (alpha > 0.001))
其他提示
这里的最重要的是,您试图表达的内容不可能通过单个逻辑条件来表达 alpha
被嵌入其中(尽管其他答案声称)。
其他答案已经向您解释说,您的病情并没有像您认为解析的方式那样解析,尽管许多答案是指参考的优先级的明显错误 =
操作员处于这种状态,而实际上没有 =
操作员在那里。正确的解释是,当您在 if
条件,语法是用初始化器声明的语法,因此整个过程的解析方式与
int alpha = value1 - value2 && alpha > 0.001;
会解析,即这是 int alpha
初始化 value1 - 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
}
左侧总是首先评估。这里的问题是操作员的优先级。看看这是否没有更好地工作:
if ((int alpha = value1-value2) && (alpha > 0.001))
在澄清了它的工作原理(出于教育目的)之后, 不要这样做. 。请勿在同一语句中混合可变初始化/分配和比较。
如果每个语句仅是“命令”或“查询”,那就更好了。
如果“如果”内部的条件非常清晰可读并且明确地繁重,那就更好了。不是整数,什么都没有,只是布尔。
病情的第一部分是整数。然后,您可以做一个布尔。您正在强迫不需要的转换。 给出IF和条件操作员的要求:BOOL。
回答标题中的问题, 这取决于操作数的类型.
对于内置类型, &&
短路,这意味着评估了LHS,如果是错误的,则根本不评估RHS。
对于已超载的用户定义类型 operator&&
, ,它不会短路。以未指定的顺序评估双方,然后调用该函数。
我认为其他人已经处理了您需要回答的问题。
如果我没记错的话,那个操作是不确定的。在单个语句中向变量进行asign to to to to变量,然后指代相同的变量。
我通常总是使用括号,只是为了使我的代码更加明确我的意图。
从左到右进行了评估。
在您的情况下,但是分配是最后发生的事情,它们的整个事情都会以(将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)
if (int alpha = value1-value2 && alpha > 0.001)
根据 规则 将按顺序评估
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也说了同样的话。
我的猜测是,这是因为您正在声明“ if”语句中的存储空间。我什至不认为这会编译。
尝试这个。
int alpha;
if ((alpha=value1-value2) && alpha>0.001)
但是我不认为这在做您需要的事情。您将Alpha作为INT,然后将其与浮点值进行比较。 &&语句的第一部分只要Alpha不是零,并且如果Alpha大于0,则第二部分将返回true。因此,您可能应该这样做
int alpha;
if ((alpha=value1-value2)>0)
或更可读的代码
int alpha=value1-value2
if (alpha>0)
但是要回答您的原始问题:&&在答案很明显时将从左到右执行,短路。即,如果&&的第一部分是错误的,那么第二部分甚至没有消失!
这是一篇文章 上市运营商的优先级和关联性.
据我所知,您的意图是声明临时性,为其分配值1-VALUE2的值,然后测试结果并输入IF块(如果大于某些值)。 alpha
被宣布为INT,但您似乎正在将其与双重比较。阿尔法应该是双重的。
您的使用临时性很有创造力。透明通常比可爱要好。而是这样做:
double alpha = value1-value2;
if (alpha > 0.001)
根据 :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)))
正如书面的那样,该表达方式如下:
- 评估
value1 - value2
并将其转换为bool
通过与零的隐式比较 - 即有效地(value1 - value2) != 0
- 评估
alpha > 0.001
截断后0.001
至int(0)
. 在此刻alpha
不是初始化的。 - 计算 逻辑和 在前两个评估中
- 转换了布尔的结果 逻辑和 回到整数
我认为这总结了其余帖子。我发布一个单独答案的唯一原因是,我找不到一个提及的答案 alpha
不是初始化的,这里发生的所有转换; 沃利克的答案 最接近。
当然,其余的答案表明您使用括号和单独的声明 alpha
正是您应采取的措施来解决此问题。在 if
语句是我没有发现重复结构中的声明的一种语言的一部分,似乎更合适。
问题是该陈述是这样评估的:
if (int alpha = (value1-value2 && alpha > 0.001))
使用括号修复&&运算符的左侧和右侧:
if ((int alpha = value1-value2) && (alpha > 0.001))