链接逻辑运算符

时间:2021-05-27 18:41:01

标签: c logical-operators logical-or logical-and

我在链接逻辑运算符时遇到了一些问题。我确定我搞砸了什么,但我没有看到。

我尝试了各种组合(例如在每个“不等于”操作周围添加括号等):

if (a != b && (a != EOF || b != EOF)) {
    /* Do stuff */
}

但没有任何效果。 ab 是从带有 fgetc 的文件中读取的位,我可以提供更多代码。但由于这是关于链接逻辑运算符,我认为这就足够了。

如果不明显,我希望 if 条件在 ab 不同但 not 当其中之一等于 EOF 时执行。 >

4 个答案:

答案 0 :(得分:2)

将你所说的翻译成代码:

// 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 )

答案 1 :(得分:1)

为了扩展 dbush 在评论中所说的内容,如果 ab 不同,并且 a 不是 EOF,并且 {{1} } 不是EOF。这在代码中最简单地表示为

b

(请记住,if( a != b && a != EOF && b != EOF)... 是一个负值,不能存储在 EOF 变量中。)

答案 2 :(得分:0)

当您在编写条件时遇到问题时,首先尝试编写将绕过 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 )

答案 3 :(得分:-1)

试试 ( a!=b && a != EOF || a!=b && b!= EOF )