提问人:Midhun 提问时间:3/21/2017 最后编辑:Midhun 更新时间:3/21/2017 访问量:65
If 子句使用赋值运算符的行为与使用相等运算符的行为相同
If clause behaves same using assignment operators as it does using equal operator
问:
代码如下:
#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 1
10 1
111
答:
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 或 )。0
cos(x)
-1
1
x
0
cos(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)
评论