C 语言运算符 [关闭]

Posted

技术标签:

【中文标题】C 语言运算符 [关闭]【英文标题】:C Language Operators [closed] 【发布时间】:2017-08-04 20:20:47 【问题描述】:
#include <stdio.h>  

int main() 


    int a=-1?2:5 + 8?4:5;
    printf("%d\n",a);
    return 0;

上面程序的输出是2。但是为什么呢?请解释

【问题讨论】:

不要这样写代码,拜托。 您可以尝试将代码分解为单个表达式并打印出来 你应该解释为什么你不能解释这段代码。 为什么你认为它可能不是2?解释你的推理,然后我们可以帮助你了解你哪里出错了。 【参考方案1】:

编写人类可读和可理解的代码。 (至少,尝试...

 int a=-1?2:5 + 8?4:5;

一样
int a = (-1) ? 2 : ( 5 + ( 8 ? 4 : 5) );

参考:Operator Precedence

现在,让我们将其与三元运算符条件进行比较,如C11,第 6.5.15 章所述,

计算第一个操作数;在它的求值和 第二个或第三个操作数的评估(以评估者为准)。第二个操作数 仅当第一个比较不等于 0 时才评估;仅在以下情况下评估第三个操作数 第一个比较等于 0;结果是第二个或第三个操作数的值 (以评估为准),

所以,在你的情况下,

第一个操作数不等于零 因此,它计算第二个操作数,并将结果(操作数的值)返回并存储到赋值运算符的 LHS 变量中。

【讨论】:

我反对将第二种形式称为“人类可读和可理解” @StoryTeller 好吧,现在好点了吗?不能做更多的事情。 并非如此。我的反对意见一般是对任何使用三元运算符的代码应用“人类可读和可理解的”:) @StoryTeller :) 我知道,请参阅问题下的评论。【参考方案2】:

声明:

int a=-1?2:5 + 8?4:5;

或者最好用括号写:

int a = (-1) ? 2 : ( 5 + 8?4:5);

这又意味着:

if (-1)
    a = 2;
else 
    if (8)
        a = 9; //5+4
    else
        a = 10; //5+5

任何不同于0 的条件都被评估为true。所以条件if(-1) 不同于0,因此true。因此,if 块将被执行,a 将获得值2

【讨论】:

【参考方案3】:

因为如果a 不为零,则a ? b : c 的计算结果为b,并且在您的代码中a (-1) 不为零且b 为2。

【讨论】:

【参考方案4】:

让我们一步一步来看看,

int a=-1?2:5 + 8?4:5;

int a = (-1) ? 2 : ( 5 + 8?4:5);

对于三元运算符(条件)?返回真:返回假;

0 = False 
Other than 0 = true

因此 -1 = 真

  int a = (true) ? 2 : ( 5 + 8?4:5);
  int a = 2;

【讨论】:

这里是C,这里truefalse实际上已经定义了值,这里分别是1和0。 @SouravGhosh 宏 truefalse 是 C 标准库的一部分,而不是语言的一部分。它们的 整数常量 值 1 和 0 是在读取 &lt;stdbool.h&gt; 时定义的。这个答案显然在逻辑意义上使用“true”、“false”,而不是 C 库关键字意义上的。 @chux 同意,只是想发表评论以澄清这一点,感谢您完成评论。 :)【参考方案5】:

一般说明:格式:

x = a ? b : c;

意思:

if (a) // always results in true unless a = 0
    x = b;
else
   x = c;

现在,括号中的语句:

int a = (-1) ? 2 : ( 5 + ( 8 ? 4 : 5) );

只是一个缩短的 if-else 嵌套语句组。展开后,它看起来像:

if (-1) // since it is not zero, this is true
    a = 2;

else // since the if-block is true, this is ignored by the compiler

    if (8)
        a = 5 + 4; // computes to 9
    else
        a = 5 + 5; // computes to 10

因此,由于第一个 if 语句为真,编译器将 2 存储在变量 a 中。

顺便说一句,您应该避免编写难以阅读的代码。尽管您的语句比编写整个 if 块短,但阅读 if-else 嵌套块比阅读您的语句更容易理解。

【讨论】:

以上是关于C 语言运算符 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果编程语言具有数据类型但没有运算符重载,它仍然可以称为“类型化”吗? [关闭]

关于地图的C ++下标运算符[关闭]

嵌入式C中模运算符的替代方案? [关闭]

C语言中位移位运算符?

C语言运算符优先级顺序

C ++“删除[]”运算符仅删除2个第一个值[关闭]