C编程-使用#define定义常量参数并执行操作

nle07wnf  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(94)
#include <stdio.h>

#define Cpl 830
#define Tl 1708
#define Td 2200  
#define den 7200

int main()
{
    double hd1 = Cpl*(Td - Tl);
    double hd2 = Cpl*(Td - Tl)*den;
    double hd3 = hd1 * den;

    printf("%e\n", hd1);
    printf("%e\n", hd2);
    printf("%e\n", hd3);
    
    return 0; 
}

HD2和HD3不相等?提问的形式比问题本身要难得多。这些词的存在是因为它需要更多的话,使问题看起来很好。

3lxsmp7m

3lxsmp7m1#

那条线

double hd2 = Cpl*(Td - Tl)*den;

执行整数计算,因为所有操作数都是整数常量,并将结果转换为double,而行

double hd3 = hd1 * den;

执行浮点(双精度)计算,因为一个操作数是double类型的变量。
在数字上添加一个小数点,将它们标记为double常量。
还要注意的是,Cpl*(Td - Tl)*den;很可能导致 * 有符号整数溢出 * 和 * 未定义行为 *。

oalqel3c

oalqel3c2#

声明

double hd2 = Cpl*(Td - Tl)*den;

相当于:

double hd2 = 830 * (2200-1708) * 7200;

*-操作的所有操作数的类型都是int,因为这是integer constant的默认类型。这意味着操作的结果也总是int类型。但是,在您的平台上,类型int可能无法表示数学结果2,940,192,000,因为int(即INT_MAX)可表示的最大值可能是32,7672,147,483,647,具体取决于您使用的平台。因此,您有一个signed integer overflow,它调用未定义的行为。在大多数平台上,这将导致结果值被截断。
数据类型double能够表示更大范围的数字。因此,如果您将操作数的类型更改为double,则问题将消失。将数据类型更改为double的最简单方法是在末尾添加.0

#define Cpl 830.0
#define Tl 1708.0
#define Td 2200.0
#define den 7200.0

相关问题