【问题标题】:Float in if statements returns negative instead given value浮点数 if 语句返回负数而不是给定值
【发布时间】:2021-04-06 17:58:37
【问题描述】:

您好,我正在学习 C,我很困惑为什么这一行返回 -126.00 而不是 130.00

这里是源代码:

char course1(char course, float price){

    if(course == 'E' || course == 'e') {
        printf("You have taken PHP!\n");
        price = 130.00;
        return price; //returns -126.00
    }
    else
        printf("Invalid!\n");
    return 0;
}
int main() {  
   char course;
   float totalCourse;
   float y = 0;
   scanf(" %c", &course);
   totalCourse += course1(course, y);
   printf("In main, the total is %.2f", totalCourse);

   return 0;
}

当我运行代码并输入“E”时,C 返回 -126 而不是源代码中给出的 130。谁能解释一下为什么会这样?

【问题讨论】:

  • 因为某种原因你返回char
  • 另外totalCourse 未初始化
  • 与您的问题无关:不要将float 用于货币价值。它不符合您在数钱时所期望的数学。使用double 会稍微不那么糟糕,但仍然很糟糕。使用整数,并计算美分。

标签: c return-value function-definition


【解决方案1】:

对于初学者,函数中不使用参数price。那就是它的值被忽略了。

char course1(char course, float price){

    if(course == 'E' || course == 'e') {
        printf("You have taken PHP!\n");
        price = 130.00;
        return price; //returns -126.00
    }
    else
        printf("Invalid!\n");
    return 0;
}

其次,该函数的返回类型为char,而不是float。它至少应该有返回类型float

除此之外,变量totalCourse 未初始化。

float totalCourse;

所以这个复合赋值运算符+=

totalCourse += course1(course, y);

调用未定义的行为。

【讨论】:

    【解决方案2】:

    数据类型char 通常是signed,就像您的情况一样。 signed char 的范围通常为 -128 到 +127。

    您将值 130 分配给此类数据类型。通过常用的二进制补码,值 130 被“环绕”:

    • ...
    • 127 -> +127
    • 128 -> -128
    • 129 -> -127
    • 130 -> -126

    编辑:

    如果您从范围上方的输入中减去可能值的数量,或者添加到范围下方的输入中,您也可以计算结果值。对于典型的char,这个数字是 28 = 256,你得到 130 - 256 = -126。

    利用您的数学技能将其带入一个通用公式。 ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多