int main()
{
int i = 10;
if (i ==20 || 30)
printf("true");
else
printf("false");
return 0;
}
输出是' True'为什么?
如果我们替换||与&&会发生什么变化?
答案 0 :(得分:3)
与语言之间的任何翻译一样,您不必通过逐字替换来保留意义。
英语短语" x是y或z"倾向于在技术语言中翻译为类似于" x是y或x是z"或" x是包含y和z"。
的集合的元素你想要的是i == 20 || i == 30
。
你写的表达式,i == 20 || 30
转换为"我是20,或者是真的"这与" true"相同。原因是30
在这种情况下有效地转换为布尔值,并且由于30非零,它转换为" true"。
您可能编写的第三个变体是i == (20 || 30)
,它等同于i == 1
(因为20和30转换为true,然后true转换回1)。
答案 1 :(得分:2)
int i = 10;
if (i == 20 || 30)
相当于
if ((i == 20) || 30)
所以第一次测试是否为false,第二次测试为非0,则计算结果为true。由于两个评估中的一个是真的,整个测试都是正确的。
将||
替换为&&
时会发生什么?
if ((i == 20) && 30)
这里由于两个评估中的一个是错误的,整个测试都是错误的。
答案 2 :(得分:1)
因为0以外的每个值都是真的。在条件中它表示如果我等于20是假的或30是真的并使整个陈述成立。如果您更改或使用a,则语句将为false。
答案 3 :(得分:0)
30在逻辑上是正确的。任何非零值都是真的。 OR表达式的计算结果为true,因为30在逻辑上是真的。
将OR更改为AND会导致表达式逻辑错误。