【问题标题】:Output: relational and ternary operator?输出:关系和三元运算符?
【发布时间】:2014-09-19 18:27:01
【问题描述】:
#include<stdio.h>
main()
{
int big,x=3,y=2,z=1,q=4;
big=( x>y ? (x<z ? 20:10 && y>x ? 50:10 ) : (y>z ? 40:10 || x<q ? 30:10));
printf("big =%d",big);
return 0;
}

&& 是一个关系运算符,因此它应该返回一个真或假值,即 0 或 1,但在这种情况下它不是。请解释其输出背后的逻辑是什么?

Output: big =10

【问题讨论】:

  • 请更新问题以向我们展示输出是什么。
  • 这样的代码是谁写的?
  • 这是从一个必须预测以下代码 sn-p 的输出的门户获取的。因为我无法弄清楚我在这里发布了它!

标签: c output ternary-operator


【解决方案1】:

这都是关于运算符优先级(以及令人痛苦的缺少括号)。

当我运行你的程序时得到的输出是nbig =10(没有换行符;你应该在你的格式字符串中添加一个\n)。

分配给big 的值不是&amp;&amp;|| 运算符的结果。让我们减少过于复杂的表达,一次一步。 (我在每一步都确认结果不变。)

big=(x>y?(x<z?20:10 && y>x?50:10) : (y>z?40:10 || x<q?30:10));

我们知道x&gt;y为真,所以我们可以去掉测试和对应?:运算符的第三个操作数:

big=(x<z?20:10 && y>x?50:10);

让我们删除多余的外括号,在外部 ?: 运算符的第三个操作数周围添加一些新的,并稍微改变间距:

big = x<z ? 20 : (10 && y>x?50:10);

我们知道x&lt;z 是假的,所以我们可以删除它以及外部?:second 操作数:

big = (10 && y>x?50:10);

显然10 是真的,所以:

big = (y > x ? 50 : 10);

y &gt; x 是假的,所以结果是10——这是我运行你的程序时得到的。

您可能认为:

 a ? b : c && d ? e : f

相当于:

 (a ? b : c) && (d ? e : f)

但实际上它相当于:

 a ? b : ((c && d) ? e : f)

因为&amp;&amp; 运算符比?: 运算符绑定得更紧密。

无论如何,如果这是真实的代码,您绝对应该添加足够多的括号,以便知识渊博的读者可以理解代码,而无需查阅运算符优先级表。混合&amp;&amp;||?: 可能会特别令人困惑。将表达式分解为子表达式,并将每个子表达式分配给一个临时变量(因此它具有一个有意义的名称)也很有帮助。

如果您尝试编写一个复杂的表达式,上述内容适用。如果你想理解别人写的东西,你几乎必须自己解析它。尝试做我所做的:以不改变含义的方式逐步简化表达式(通过删除部分或添加括号),在每个步骤中确认您得到相同的结果。如果是生产代码(而不是测验,这似乎是),请考虑苦涩抱怨鼓励作者编写更清晰的代码。

【讨论】:

    【解决方案2】:

    让我们通过添加括号来显示优先级,让您的表达更加明确:

    ((x>y) ?
       ((x<z) ?
         20 : ((10 && (y>x)) ? 50 : 10)
       ) : (
         (y>z)?40:((10 || (x<q))?30:10)
       )
    )
    

    x大于y,所以我们考虑

    ((x<z) ?
       20 : ((10 && (y>x)) ? 50 : 10)
    )
    

    x不小于z,所以

    ((10 && (y>x)) ? 50 : 10)
    

    y 不大于x,所以

    10
    

    您可以看到结果实际上不是您的逻辑运算符。由于涉及的复杂性,您几乎可以肯定地使用if 语句来表达这样的评估,以便以一种简洁的方式分解逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-22
      • 2021-04-14
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多