为什么“if约束”在代码中不起作用?

时间:2014-09-20 09:42:50

标签: c

第一个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;
  }

即使输入大于约束关系的值,循环也在运行。

3 个答案:

答案 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的整数真值01)然后比较 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))