2017-05-29 101 views
-1
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

+4

'!!(i = 5)== true'这就是为什么。 – 0andriy

+1

为什么你忽略编译器警告?如果你的编译器不警告,立即得到一个现代编译器!正如你所说:“'='是一个赋值**运算符**” – Olaf

回答

0

i=5是一个非常有效的表达式,可以放入条件式中,即使它不是对等式的测试。该分配产生的值不为零,因此条件仍然正确。

+0

然而编译器会发出警告...... –

+0

@EugeneSh。一些编译器会。虽然没有保证。 –

+1

请注意,由于运算符的优先级,“i = 5”不在OP代码中评估;而'5 && j> 5'的结果被分配给'i'。 –

5

在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) 
+1

适合指出可能是分配给'i'的意外值。 –

0

可以在条件参数赋值的变量,比如

帐户
While((a=b)!=null){ 
    ... 
) 

尝试输出每个变量(i,j)看看发生了什么