链接逻辑运算符
Chaining logical operators
我在链接逻辑运算符时遇到了一些问题。我确定我搞砸了,但我没有看到它。
我已经尝试了各种组合(比如在每个“不等于”操作周围添加括号等):
if (a != b && (a != EOF || b != EOF)) {
/* Do stuff */
}
但没有任何效果。 a
和 b
是用 fgetc
从文件中读取的位,我可以提供更多代码。但由于这是关于链接逻辑运算符,我认为这就足够了。
如果不明显,我希望 if 条件在 a
和 b
不同但 not 其中一个等于 [=16 时执行=].
为了扩展 dbush 在评论中所说的内容,如果 a
与 b
不同并且 a
不是 EOF,并且 b
不是 EOF。这在代码中最简单地表示为
if( a != b && a != EOF && b != EOF)...
(请记住,EOF
是一个负值,不能存储在 unsigned
变量中。)
尝试 ( a!=b && a != EOF || a!=b && b!= EOF )
将您所说的翻译成代码:
// I want the if condition execute:
// if a and b are different but not when one of them equals EOF
if ( a != b && ! (a == EOF || b == EOF) )
然后应用 DeMorgan 规则,将 NOT 移到内部并将 OR 切换为 AND:
if ( a != b && a != EOF && b != EOF )
当您在编写条件时遇到问题,那么首先尝试编写一个将绕过 if 语句的子语句的条件。
对于您的 if 语句,假条件看起来像
a == b || a == EOF || b == EOF
然后使用它的否定
if ( !( a == b || a == EOF || b == EOF ) )
现在可以改写成
if ( !( a == b ) && !( a == EOF ) && !( b == EOF ) )
反过来看起来像
if ( a != b && a != EOF && b != EOF )
我在链接逻辑运算符时遇到了一些问题。我确定我搞砸了,但我没有看到它。
我已经尝试了各种组合(比如在每个“不等于”操作周围添加括号等):
if (a != b && (a != EOF || b != EOF)) {
/* Do stuff */
}
但没有任何效果。 a
和 b
是用 fgetc
从文件中读取的位,我可以提供更多代码。但由于这是关于链接逻辑运算符,我认为这就足够了。
如果不明显,我希望 if 条件在 a
和 b
不同但 not 其中一个等于 [=16 时执行=].
为了扩展 dbush 在评论中所说的内容,如果 a
与 b
不同并且 a
不是 EOF,并且 b
不是 EOF。这在代码中最简单地表示为
if( a != b && a != EOF && b != EOF)...
(请记住,EOF
是一个负值,不能存储在 unsigned
变量中。)
尝试 ( a!=b && a != EOF || a!=b && b!= EOF )
将您所说的翻译成代码:
// I want the if condition execute:
// if a and b are different but not when one of them equals EOF
if ( a != b && ! (a == EOF || b == EOF) )
然后应用 DeMorgan 规则,将 NOT 移到内部并将 OR 切换为 AND:
if ( a != b && a != EOF && b != EOF )
当您在编写条件时遇到问题,那么首先尝试编写一个将绕过 if 语句的子语句的条件。
对于您的 if 语句,假条件看起来像
a == b || a == EOF || b == EOF
然后使用它的否定
if ( !( a == b || a == EOF || b == EOF ) )
现在可以改写成
if ( !( a == b ) && !( a == EOF ) && !( b == EOF ) )
反过来看起来像
if ( a != b && a != EOF && b != EOF )