C语言中的条件运算符查询

3
{

   int i=0;

   int j;

   j=(i=0)?2:3;

   printf("the answer is %d",j);

}

我想知道为什么当变量 i 的值为零时,语句 j=(i=0)?2:3; 的结果是 3


2
尝试使用i==0而不是i=0 - barak manos
@barakmanos 请你说出你自己的看法... - autistic
@undefinedbehaviour:为什么? - barak manos
1
@undefinedbehaviour,你刚刚提供了证据表明你自己没有尝试过,因为它确实有区别 :-) 也就是说,i==0会被评估为true,而i=0会被评估为false。 - juanchopanza
1
@undefinedbehaviour:1. OP提问(我引用):“当将值定义为i为零时,为什么此语句会给出答案3”。我想到的是隐含的问题是为什么这个语句没有给出2,所以通过指出这一点,我只是试图回答那个(隐含的)问题。 - barak manos
显示剩余5条评论
5个回答

5
在C语言中,0被视为假,所有非零数字被视为真。这段代码:
j=(i=0)?2:3;

是相同的

if(i = 0)
    j = 2;
else
    j = 3;

在这里,i = 0将0赋值给i,由于0被认为是false,因此else语句执行,将3赋值给j
请注意,=是赋值运算符,将左右操作数赋值。这与条件运算符==不同,后者比较其操作数并返回0(假)或1(真)。
如果你想表达的是 ==,那么 j=(i==0)?2:3; 和下面这行代码是等价的。
if(i == 0)
    j = 2;
else
    j = 3;

这将在i == 0为真时将2分配给j
为了避免这种错误,你可以使用 Yoda条件,如 @JackWhiteIII所建议的,即反转条件。例如,保留HTML标签:


j=(i=0)?2:3;

可以写成

j=(0=i)?2:3;

由于0是一个常量值,无法更改,编译器会发出错误提示,以防止这种错误。请注意,0 == ii == 0都可以实现同样的功能,并且两者都是有效的。


我认为添加“0 == i”将对OP有很大帮助,因为编译器会告诉他们出了什么问题。 - JackWhiteIII
@JackWhiteIII 尽管这种风格可能看起来很丑陋,但是你怎么知道 OP 没有打算像那样将赋值嵌套到条件语句中呢?我喜欢这个答案,因为它不做任何假设。 - autistic
由于提问者询问为什么 i 为零时会得到3,因此出现了 @undefinedbehaviour。 - JackWhiteIII
@JackWhiteIII,已将您的建议添加到答案中。 - Spikatrix
@undefinedbehaviour 当然输出会改变。为什么不自己试一下呢? - juanchopanza
显示剩余3条评论

2

i=0是赋值语句,用i==0进行比较。

赋值语句返回被赋的变量的新值,在这里是0。作为条件判断,结果为false。


1
如上代码片段所示,
{

   int i=0;

   int j;

   j=(i=0)?2:3;

   printf("the answer is %d",j);

}

你输错了,将 (i==0) 写成了 (i=0),这只是将 0 赋值给了 i 并检查了结果,因此你得到的输出是答案为3。新代码应该像这样:{
   int i=0;

   int j;

   j=(i==0)?2:3;

   printf("the answer is %d",j);

}

上面纠正后的代码片段输出结果为答案是2

0
因为您错用了 == 运算符。 您将 i 设置为值 0 并再次测试此值,因此结果是 false,即使它在代码中看起来是 true。
请改为这样编写代码:
j = (i == 0) ? 2 : 3;

0

赋值运算符(在 i=0 中的 =)的结果是对象的新值(0)。0 是假值,因此您的条件选择了“false”分支,即 3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接