虽然有多种条件

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

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

引起问题。

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

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

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

ch != '\n' || ch != ' ' 无论角色是什么, ch != '\n' || ch != ' '总是如此。

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

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

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

老答案:

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

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

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

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

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

在布尔表达式中使用not时,你应该小心,你没有得到AND和OR混合。 了解德摩根定律 。 通常只用一个否定内容就更容易阅读。 将De Morgan定律应用于你的表达式给出了:

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

如果你已经用这种forms写了它,你将立即注意到(ch ==’\ r’&& ch ==’\ n’)永远不会成立。

解决方案是改变这个:

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

进入这个:

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

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

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

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

要么

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

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