【问题标题】:Why does the OR statement evaluate only one even if both are true? [duplicate]为什么 OR 语句只评估一个,即使两者都为真? [复制]
【发布时间】:2020-01-16 09:06:08
【问题描述】:

考虑以下 C 代码,根据我所学到的,OR 语句应该同时评估 printf。但在实际输出中我只看到“XX”。为什么会这样?

#include<stdio.h>
int main() {
    int a;
    a = (printf("XX")||printf("YY"));
    printf("%d\n",a);
    a = (printf("XX")&&printf("YY"));
    printf("%d\n",a);
}

输出 -

XX1 XXYY1

【问题讨论】:

  • 也就是所谓的短路求值,如果第一个操作数为真,则整个运算也为真,所以不需要对第二个操作数求值
  • @EduardoPascualAseff 知道了!我现在该怎么办?删除问题?
  • @Agile_Eagle 做你想做的事

标签: c conditional-statements boolean-logic


【解决方案1】:

即使一个条件为真,OR 运算符的输出也为真。在这种情况下,第一个 printf 语句返回 true。所以不需要计算 OR 运算符的第二个操作数。

【讨论】:

    【解决方案2】:
    如果任何操作数为真,

    || 运算符的计算结果为真。因此,如果第一个操作数的计算结果为 true 它不会检查第二个。如果第一个操作数为假,它只检查第二个操作数。

    &amp;&amp; 运算符仅在两个操作数都是 true 时才计算为真。如果第一个不是false,它将检查第二个操作数。

    manpage中所述:

    成功返回后,这些函数返回打印的字符数(不包括用于结束输出到字符串的空字节)。 函数 snprintf() 和 vsnprintf() 写入的字节数不超过 size 字节(包括终止的空字节 ('\0'))。如果输出由于此限制而被截断,则返回值是字符数(不包括终止的空字节),如果有足够的空间可用,这些字符将被写入最终字符串。因此,大小或更大的返回值意味着输出被截断。 (另请参阅下面的注释。)

    假设你有这样的代码:

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        printf("%d", printf(""));
        return 0;
    }
    

    这将打印0,正如手册页中所述。

    如果你的陈述是:

    printf("") && printf("XX");
    

    它不会打印任何内容,因为第一个操作数评估为 0

    然而,

    printf("") || printf("YY");
    

    将打印YY

    在你的情况下,

    a = (printf("XX")||printf("YY"));
    

    仅当第一个操作数无法打印任何内容时才会评估 printf("YY")

    a = (printf("XX")&&printf("YY"));
    

    printf 都成功时,将打印XXYY

    【讨论】:

      【解决方案3】:

      假设您要回答“下雨还是晚上 7 点之后?”这个问题。一旦你看到正在下雨,你就知道答案是“是”。您无需检查是否在晚上 7 点之后。

      a = (printf("XX")||printf("YY"));
      

      你问了一个“或”的问题。一旦它评估了第一个printf,它就知道你的问题的答案是肯定的,所以它不需要评估第二部分。

      【讨论】:

        【解决方案4】:

        如果左侧部分已确定为真,|| 或 OR 运算符不会评估其右侧部分。因为它不需要:TRUE || something“总是”为真。即使潜在的崩溃隐藏在右侧。总是先检查左边的部分。

        如果出错,printf 的返回值不是“false”:它返回-1。 “false”值为 0,如果您尝试打印空格式字符串,或者在其开头放置一个 '\0',就会出现这种情况。在一般情况下,任何非 0 的值都被评估为“真”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          • 1970-01-01
          • 2012-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-07
          相关资源
          最近更新 更多