C中的条件运算符查询

时间:2015-06-13 07:02:24

标签: c

{

   int i=0;

   int j;

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

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

}

我想知道为什么当j=(i=0)?2:3;的值定义为零时,此语句3会给出答案i

5 个答案:

答案 0 :(得分:5)

在C中,零被视为假,所有非零数字都被视为真。这样:

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

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

此处,i = 0将0分配给i,因为0被视为false,否则执行else,将3分配给j

请注意=是赋值运算符并指定其左右操作数。这与条件运算符==不同,条件运算符==比较两个操作数,如果为false则返回0,如果为真,则返回1.

如果您的意思是j=(i==0)?2:3;,则if(i == 0) j = 2; else j = 3;

相同
j

i == 0分配为j=(i=0)?2:3; j=(0=i)?2:3; 为真。

为防止出现这类错误,您可以使用Yoda Conditions as suggested by @JackWhiteIII,即逆转条件。例如,

0 == i

可以写成

i == 0

由于0是常量值且无法更改,因此编译器会发出错误,从而防止出现这类错误。请注意,if (!hooks) { /* Reset hooks */ cJSON_malloc = mem_alloc; // its equal to gcc malloc for the embedded compiler cJSON_free = mem_free; // its equal to gcc free } {8,8,15...}都做同样的事情,两者都确实有效。

答案 1 :(得分:2)

i=0是一项任务。使用i==0进行比较。

分配返回分配给的变量的新值。就你而言,那是0。评估为条件,这是错误的。

答案 2 :(得分:1)

与上面的代码段一样,

{

   int i=0;

   int j;

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

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

}

你错误输入,(i == 0)with(i = 0),它只给0分配i并检查结果,因此你得到的输出为,答案是3 。新代码就像, {

   int i=0;

   int j;

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

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

}

上面修正的代码剪切得出输出为, 答案是2

答案 3 :(得分:0)

因为您错误输入了==运算符。您再次将i设置为值0并测试此值, 为0,因此为false。

改为写下:

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

答案 4 :(得分:0)

赋值运算符i=0中的0)的结果是对象的新值(0)。 3是一个假值,因此会选择条件的“假”分支,即\".*\"|\'.*\'|[^\s]*?(?=\s|$)