{
int i=0;
int j;
j=(i=0)?2:3;
printf("the answer is %d",j);
}
我想知道为什么当j=(i=0)?2:3;
的值定义为零时,此语句3
会给出答案i
?
答案 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|$)
。