2017-03-21 32 views
-1

这里使用赋值运算符是一个代码的行为相同:如果条款因为它不使用等于操作员

#include <stdio.h> 
#include <math.h> 
void main() 
{ 
     double pi = 3.1415926535; 
     int a = 1; 
     int i;  
     for (i=0; i < 3; i++) 
      if (a = cos(pi * i/2)) 
        printf("% d", 1); 
      else printf("%d", 0); 
} 

线if (a = cos(pi * i/2))执行分配操作,然后检查的条件。所以在这种情况下,输出总是1,因为总是执行赋值操作。但是这里的输出来自10 1。因此,我认为我错了。为什么输出是10 1而不是111?请帮忙。

回答

2

首先=是赋值运算符。编译器应该警告你,你忽略了这个警告吗?那么,不要!

其次,你不能比较浮点数可靠,并cos()将返回这样一个数字,所以也许

if (a == (int) cos(pi * i/2)) ... 

可以做到这一点。

此外,

printf("% d", 1); 

应该是

printf("%d", 1); 
/*  ^no space here */ 

和真,

printf("1\n"); 
+0

我想知道的是为什么输出是'101'? – Midhun

+4

现在你知道如何发现,你不觉得它更好吗? –

1

的如果表达式求的分配的值。在这种情况下,由于a被声明为int,所以它将被截断,所以严格小于1的值将计算为0 - 即false。由于cos(x)总是-11,唯一的时间之间的,若块是如果x0或pi的倍数时(cos(x)将评估准确1-1),你会进入。

1

首先明白if块将对每个非零值执行,如-2,-3,234,1,-9999, ,但对于值0,块将不执行。 所以来你的代码,

for循环运行三次 I = 0,1,2

对于i = 0:如果块将执行

cos(pi * i/2) => cos(pi* 0/2) => cos(0) => 1 
if(a = cos(pi * i/2)) => if(a = 1) => if(1) 

对于i = 1:如果块将不执行

cos(pi * i/2) => cos(pi * 1/2) => cos(pi/2) => 0 
if(a = cos(pi * i/2)) => if(a = 0) => if(0) 

对于i = 2:如果块将执行

cos(pi * i/2) => cos(pi * 2/2) => cos(pi)) => -1 
if(a = cos(pi * i/2)) => if(a = -1) => if(-1)