If 子句使用赋值运算符的行为与使用相等运算符的行为相同

If clause behaves same using assignment operators as it does using equal operator

提问人:Midhun 提问时间:3/21/2017 最后编辑:Midhun 更新时间:3/21/2017 访问量:65

问:

代码如下:

#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); 
}

该行执行分配操作,然后检查条件。因此,这样,输出应始终为 1,因为赋值操作始终执行。但是输出来了.因此,我认为我弄错了。为什么输出是而不是?请帮忙。if (a = cos(pi * i/2))10 110 1111

c if 语句 相等 赋值运算符

评论


答:

2赞 Iharob Al Asimi 3/21/2017 #1

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

其次,你不能可靠地比较浮点数,并且会返回这样的数字,所以也许cos()

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

可以做到。

printf("% d", 1);

应该是

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

真的,

printf("1\n");

评论

0赞 Midhun 3/21/2017
我想知道的是为什么输出是?101
4赞 Iharob Al Asimi 3/21/2017
现在你知道怎么找出来了,你不觉得更好吗?
1赞 happydave 3/21/2017 #2

if 表达式的计算结果为 a。在这种情况下,由于 a 被声明为 int,它将被截断,因此任何严格小于 1 的值都将计算为 - 即 false。由于总是介于 和 之间,因此您输入 if 块的唯一时间是 if is 或 pi 的倍数(何时将计算结果为 exactly 或 )。0cos(x)-11x0cos(x)1-1

1赞 shivamg11000 3/21/2017 #3

首先了解 if 块将针对每个非零值执行,例如 -2,-3,234,1,-9999 但对于值 0,该块将不会执行。 所以来到你的代码,

for 循环运行 3 次 我 = 0、1、2

for i = 0 : 如果块将执行

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

for 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)

for i = 2 : 如果块将执行

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