我有一个我不太确定的中期问题示例。这是:
#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
?如何评估以及之后会发生什么?
答案 0 :(得分:8)
让我们添加所有隐含的括号(记住||
的{{3}}高于=
且=
是右关联的):
i = ((4 || i) = 5)
因此,它首先评估4 || i
,其评估结果为true
(实际上,它甚至会忽略i
,因为4
是true
和{{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不等于零。