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,这里true
和false
实际上已经定义了值,这里分别是1和0。
@SouravGhosh 宏 true
和 false
是 C 标准库的一部分,而不是语言的一部分。它们的 整数常量 值 1 和 0 是在读取 <stdbool.h>
时定义的。这个答案显然在逻辑意义上使用“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 语言运算符 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章