第一个if语句不起作用且代码正在运行而不考虑约束。
#include <stdio.h>
int main(void)
{
int with;
int inacbal;
float acleft;
scanf("%d",&with);
scanf("%d",&inacbal);
if(0<=with<=2000&&0<=inacbal<=2000) //this statement not working
{
if((with%5)==0)
{
if(inacbal>with)
{
acleft=(float)inacbal-(float)with-0.50;
printf("%.2f",acleft);
}
else
printf("%d",inacbal);
}
else
printf("%d",inacbal);
}
return 0;
}
即使输入大于约束关系的值,循环也在运行。
答案 0 :(得分:5)
虽然数学家有时使用简写a < b < c
,但C语言更严格。
你必须改写:
if(0<=with<=2000&&0<=inacbal<=2000)
类似于:
if((0 <= with) && (with <= 2000) && (0 <= inacbal) && (inacbal <= 2000))
你实际拥有的 是有效的C,但它没有达到你通常所期望的效果。表达式1 < 2 < 3
实际上意味着:计算1 < 2
(分别给出false和true的整数真值0
或1
)然后比较 3
。
如果希望使用更短的表单,您可以使用以下内容:
#define between(a,b,c) (((a) <= (b)) && ((b) <= (c)))
:
if (between (0, with, 2000) && between (0, inacbal, 2000))
如果您在使用a++
时使用int between (int a, int b, int c) {
return (a <= b) && (b <= c);
}
这样的术语,则需要注意重复的副作用。一种更安全的方法可能是用以下内容替换宏:
{{1}}
答案 1 :(得分:2)
声明
if(0<=with<=2000&&0<=inacbal<=2000)
不检查给定范围之间的变量。这些比较在C中没有数学意义 编译器应该发出警告
[Warning] comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]
要检查某个值是否在给定范围之间,您需要使用&&
运算符。您需要将其重写为
if(0 <= with && with <=2000 && 0 <= inacbal && inacbal <=2000)
答案 2 :(得分:2)
您无法将变量与其他两个值进行比较。你应该分开条件:
if ((0<=with) && (with<=2000) && ( 0<=inacbal) && (inacbal<=2000))