运营商优先权

时间:2014-10-31 17:48:31

标签: c++ operator-precedence

我有一个我不太确定的中期问题示例。这是:

#include <iostream.h>

void f( int i )
{
 if( i = 4 || i = 5 ) return;
 cout << "hello world\n" ;
}

int main()
{
f( 3 );
f( 4 );
f( 5 );
return 0;
}

所以我理解逻辑OR运算符具有更高的优先级,并且从左到右读取。我也明白,正在使用的是赋值运算符而不是关系运算符。我只是不明白如何理解这一切。编译器检查的第一件事是4 || i?如何评估以及之后会发生什么?

3 个答案:

答案 0 :(得分:8)

让我们添加所有隐含的括号(记住||的{​​{3}}高于==是右关联的):

i = ((4 || i) = 5)

因此,它首先评估4 || i,其评估结果为true(实际上,它甚至会忽略i,因为4true和{{1短路)。然后,它会尝试将||分配给precedence

答案 1 :(得分:3)

如上所述,代码无法编译,因为运算符优先级意味着它的i = ((4 || i) = 5)或其他东西,并且您无法分配给(4 || i)之类的临时值

如果由于某种原因操作应该是赋值=而不是比较==,并且赋值表达式应该是||的操作数,那么你&#39;需要括号

(i = 4) || (i = 5)

正如你所说,i=4的结果是4(或更确切地说,左值指的是i,现在的值为4)。这是在布尔上下文中使用的,因此通过将其与零进行比较将其转换为bool:零将变为false,而任何其他值变为true

由于||的第一个操作数为真,所以第二个操作数未被评估,整体结果为真。所以i留下值4,然后函数返回。无论您传递给函数的任何值,该程序都不会打印任何内容。

使用比较操作会更有意义

i == 4 || i == 5

意味着当参数既不是4也不是5时,函数只会打印一些东西;所以它只会在你的例子中打印一次f(3)

请注意,<iostream.h>几十年来一直不是标准标题。您正在使用一些非常可疑的代码来教授该语言的过时版本。你应该给自己good book并且不要在这门课上浪费时间。

答案 2 :(得分:1)

编译器应该出错,因为表达式4 || i不是左值,可能不会被赋值。

至于表达式本身,那么它的值总是等于true,因为4不等于零。