#include
#include
int main()
{
float x=0.5,y;
if(01)
{
y=x;
printf("%f\n",y);
}
else if(3<=x<=4)
{
y=fabs(x)+2;
printf("%f\n",y);
}
}
为什么直接跳过了第一个条件,直接进入了第二个过程
参考GPT和自己的思路:首先要说明的是,语句 if(0<x<1)
这种写法在 C 语言中是不合法的,因为它并不像我们想象中的那样对 x
进行区间判断。实际上,它会先计算 0<x
的结果(因为 <
的优先级高于 >
),然后再将这个结果与 1 进行比较。由于 C 语言中的逻辑运算符是左结合的,所以这条语句的实际效果等价于 if ((0 < x) < 1)
,即先将 0 和 x
进行比较,得到一个布尔值,然后再将这个布尔值转化为 0 或 1 进行比较。显然,这并不是我们想要的结果。
假设我们想要判断 x
是否在区间 (0,1) 内,应该这样写:if (0 < x && x < 1)
。这样,先判断 0<x
是否成立,如果成立再判断 x<1
是否成立,只有两个条件都满足才会执行 if 语句块内的代码。
回到原来的代码中,由于 if(0<x<1)
的问题,实际上只有第一个条件 0<x
被判断,因为这个条件的结果是 true(x
等于 0.5),它被转化为整数类型 1,然后 1 小于 1,所以整个条件表达式的结果是 false,不满足 if 语句块的条件,所以直接跳到了第二个条件 3<=x<=4
,这个条件的结果也是 false,所以整个程序什么都不会输出。
if(0<x<1)
->
if(0<x && x<1)
3<=x<=4
->
3<=x && <=4
c语言中的条件判断和自然语言还是有差异的。修改如下:
#include<stdio.h>
#include<math.h>
int main()
{
float x=0.5,y;
if(x>0&&x<1)
{
y=x;
printf("%f\n",y);
}
else if(x>=3&&x<=4)
{
y=fabs(x)+2;
printf("%f\n",y);
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话://方法1
#include <stdio.h>
int main()
{
int m = 0;
scanf("%d", &m);
int i = 0;
//奇数位
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
printf("\n");
//偶数位
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", (m >> i) & 1);
}
return 0;
}
//方法2
#include<stdio.h>
int main()
{
int num = 0;
int i = 0;
scanf("%d", &num);
printf("奇数位:");
for (i = 31; i >= 1; i -= 2)
{
printf("%d ", ((num >> i) & 1));
}
printf("\n");
printf("偶数位:");
for (i = 30; i >= 0; i -= 2)
{
printf("%d ", ((num >> i) & 1));
}
return 0;
}