2012-04-27 33 views
2

我有下面的代码来选择正弦或余弦加以整合,C,而环路逻辑(Y!=(1 || 0))

while(x !=1 || y !=(1||0)){ 

     printf("Sin (1) or Cos (0)?\n");  
     x = scanf("%d",&y); 
     _flushall(); 

     if(y==1){ 
     printf("Sin set\n"); 
     } 
     else if(y==0){ 
     printf("Cos set\n"); 
     } 
} 

然而

y!= (1||0) 

从未评估对于y == 0为true,有人可以解释这里有什么问题吗?谢谢。

回答

2

您试图直接有效地编码布尔代数,并且C不以您提供的方式接受它。

while(x !=1 || y !=(1||0)) 

应该是

while((x!=1) || ((y!=1) || (y!=0))) 

不要低估使用过量的括号中C.优化器将可能优化代码,是更有效的反正的值。

组合,其产生该错误的计算结果如下代码的部分: LHS(左手侧),RHS(右手侧)

LHS = Y
=(1 || 0)[定义中给出]
!=(1)b/C(1 || 0)=(1)]

9

你需要(y != 1 && y != 0)(或类似的,这取决于你真正想表达的意思)。 ||运算符正在应用于操作数10。换句话说,y != (1 || 0)的意思是“做(1 || 0)然后做y != result”。

1
y != (0||1) 

相当于

y != 1 

因为0||11。如果您需要y != 0y != 1,则需要进行两次比较。

+0

这一定是真实的,或者你能只能保证(0 || 1)ISN” t 0(这仍然会给OP带来相同的行为)? – 2012-04-27 15:33:17

+0

请参阅:http://stackoverflow.com/questions/7687403/is-the-true-result-of-or-defined/7687444#7687444 – Mat 2012-04-27 15:34:21

+0

@ScottHunter:'||'和'&&'将评估为1为真,0表示错误。 – 2012-04-27 15:55:12