void main()
{
int i=4,j=12;
if(i=5 && j>5)
printf("Hi!");
else
printf("Hello!");
}
首先,上面代码的输出是Hi!。根据我的说法,它应该显示一个语法错误,因为i = 5是一个assingment operator not i == 5 if我== 5然后它也是假的,应该打印你好,但它怎么能打印嗨?if else condition with and operator
void main()
{
int i=4,j=12;
if(i=5 && j>5)
printf("Hi!");
else
printf("Hello!");
}
首先,上面代码的输出是Hi!。根据我的说法,它应该显示一个语法错误,因为i = 5是一个assingment operator not i == 5 if我== 5然后它也是假的,应该打印你好,但它怎么能打印嗨?if else condition with and operator
i=5
是一个非常有效的表达式,可以放入条件式中,即使它不是对等式的测试。该分配产生的值不为零,因此条件仍然正确。
然而编译器会发出警告...... –
@EugeneSh。一些编译器会。虽然没有保证。 –
请注意,由于运算符的优先级,“i = 5”不在OP代码中评估;而'5 && j> 5'的结果被分配给'i'。 –
在if语句
if(i=5 && j>5)
的条件等价于
if(i = (5 && j>5))
正如图5是不等于0和j是确实大于5,则表达式(5 && j>5)
的计算结果为1
和是分配给变量i
。
从C标准(6.5.16赋值运算符)
3赋值运算符存储在由 左操作数所指定的对象的值。 赋值表达式具有左 操作数的值分配后...
所以作为可变i
的值等于1
那么如果执行条件。
看来你的意思是
if(i==5 && j>5)
^^^^
考虑到,根据C标准不带参数的功能主要应声明如下
int main(void)
适合指出可能是分配给'i'的意外值。 –
可以在条件参数赋值的变量,比如
帐户While((a=b)!=null){
...
)
尝试输出每个变量(i,j)看看发生了什么
'!!(i = 5)== true'这就是为什么。 – 0andriy
为什么你忽略编译器警告?如果你的编译器不警告,立即得到一个现代编译器!正如你所说:“'='是一个赋值**运算符**” – Olaf