虽然有多种条件

时间:2010-05-01 20:16:02

标签: c

有人可以解释为什么表达式(我研究C)喜欢

while(a!=1 || b!=1 || c!=1)

导致问题。

特别是我有这个特定的代码:

while (ch != '\n' || ch != '\t' || ch != ' ') { ... } 

4 个答案:

答案 0 :(得分:7)

更新:根据您的其他评论,您的表达式错误 - 它与“while”有多个条件无关。

无论角色是什么,

ch != '\n' || ch != ' '总是如此。

如果字符不是空格,则第二个条件为真,因此OR为真。

如果字符是空格,则第一个条件为真(因为空格不是换行符)且OR为真。

正确的方法是ch != '\n' && ch != ' ' ...

OLD回答:

在正常情况下,上面的表达式没有任何问题(假设您想要这样做)。

与你的唯一问题是它有时可能不是最佳的(例如,如果b和c在整个循环中永远不会改变,在这种情况下你需要在变量中缓存b!=1的值)。 / p>

while多个条件可能会出现问题在一个案例中如果这些多个条件实际上有预期的副作用

这是由于||的惰性评估和&&在C中,如果第一个表达式为真,则不会对其余表达式进行求值,因此不会发生副作用。

答案 1 :(得分:4)

这是完全正确的。但这取决于你想要什么,也许你的意思是&&而不是||

答案 2 :(得分:3)

在布尔表达式中使用not时,你应该注意不要让AND和OR混淆。阅读De Morgan's Laws。通常只有一个否定的阅读更容易。将De Morgan定律应用于你的表达式给出了:

while (!(ch=='\r' && ch=='\n' && ch==' '))

如果你用这种形式写的,你会立即注意到(ch =='\ r'&& ch =='\ n')永远不会成真。

解决方案是改变这个:

while (ch != '\n' || ch != '\t' || ch != ' ')

进入这个:

while (!(ch == '\n' || ch == '\t' || ch == ' '))

您可以将其读作“虽然我们没有\ n或\ t或空格,但请执行此操作......”。请注意,“while not”类似于英语(和某些编程语言)中的“until”,因此您也可以将其读作“直到我们有\ n或\ t或空格,执行此操作”。

答案 3 :(得分:0)

你指的是什么问题?它通常是有意义的:

while(a == 1 || b == 1 || c == 1)  

或者

while(a != 1 && b != 1 && c != 1)

但是,如果你想要的话,你的表达没有问题。