虽然有多种条件
有人可以解释为什么表达式(我研究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)
但是,如果你想要的话,你的表达没有问题。