2016-05-30 110 views
-6
int main() 
{ 
    int i = 10; 
    if (i ==20 || 30) 
     printf("true"); 
    else 
     printf("false"); 
    return 0; 
} 

输出结果为'真',为什么?c中以下代码的输出是什么?为什么?

如果我们替换||与& &会发生什么变化?

+4

您可能想看看C中的运算符优先级。 – EOF

+1

用'&&'替换'||'时发生了什么变化? –

+0

https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcR6AXCu_I-ZkA1LxaK_a5LP-D69XBOlOPyhAx2XNgAvoeCefb4HRBq4dOFt –

回答

1

因为除0之外的每个值都为真。在这种情况下,如果我说20是假的或30是真的,并且使整个陈述成真。如果你改变或者用an,那么这个语句将是错误的。

0

30在逻辑上是正确的。任何非零值都是正确的。 OR表达式的计算结果为true,因为30在逻辑上为真。

将OR更改为AND将导致表达式变为逻辑错误。

3

与任何语言之间的翻译一样,您不一定通过逐字替换来保留含义。

英语短语“x是y或z”倾向于在技术语言中翻译为更类似于“x是y或x是z”的东西或“x是包含y和z的集合的元素”。您要的是i == 20 || i == 30

你写的表达式,i == 20 || 30转化为“我是20,或者真”,这与“真”是一样的。原因在于30在此上下文中有效地转换为布尔值,并且由于30非零,它将转换为“true”。

你可能写的第三个变体是i == (20 || 30),这相当于i == 1(因为20和30转换为真,然后真转换回1)。

2

由于operator precedence条件

int i = 10; 
if (i == 20 || 30) 

的相当于

if ((i == 20) || 30) 

所以第一测试如果否,第二,是非0,评估为真。由于两个评估中的一个是真实的,所以整个测试是真实的。

||替换为&&会发生什么情况?

if ((i == 20) && 30) 

这里因为两个评估之一是错误的,整个测试是错误的。