C语言中forumla的随机输出

C语言中forumla的随机输出,c,C,当我运行公式时,会得到随机答案: int main (void) { int F = 120; printf("%i Farenheit in Celsius is %i\n", F, (F - 32) / 1.8); return 0; } 但当我将代码更改为: int main (void) { int F = 120, C; C = (F-32)/1.8; printf("%i Farenheit in Celsiu

当我运行公式时,会得到随机答案:

    int main (void)
{
    int F = 120;


    printf("%i Farenheit in Celsius is %i\n", F, (F - 32) / 1.8);

    return 0;
}
但当我将代码更改为:

    int main (void)
{
    int F = 120, C;

    C = (F-32)/1.8;
    printf("%i Farenheit in Celsius is %i\n", F, C);

    return 0;
}
它是一致的,并且给出了正确的答案。
为什么第一个版本不能正常工作?

这是因为除法运算符
“/”
比减法运算符
“-”
具有更高的优先级,在第一个示例中,您使用的是不使用方括号,因此除法首先发生,您可以将代码更改为:

printf(“%f Farenheit,单位:摄氏度为%f\n”,f,(f-32)/1.8)


这是因为除法运算符
“/”
比减法运算符
“-”
具有更高的优先级,在第一个示例中,您使用的是不使用括号的除法运算符,因此首先进行除法,您可以将代码更改为:

printf(“%f Farenheit,单位:摄氏度为%f\n”,f,(f-32)/1.8)


使用浮点数的格式规范
%i
会导致未定义的行为。使用
%f

printf("%i Farenheit in Celsius is %f\n", F, (F - 32) / 1.8);
                                   ^^^
在第二种情况下,使用以下命令时将截断数字:

C = (F-32)/1.8;

第二个
printf
打印被截断的数字,因为您将
%i
C
一起使用,这是一个
int
对浮点数字使用格式规范
%i
会导致未定义的行为。使用
%f

printf("%i Farenheit in Celsius is %f\n", F, (F - 32) / 1.8);
                                   ^^^
在第二种情况下,使用以下命令时将截断数字:

C = (F-32)/1.8;

第二个
printf
打印被截断的数字,因为您将
%i
C
一起使用,这是一个
int
这是因为在第一个版本中,在
F-…
中将结果减为
F
之前,您会执行
32/1.8

printf("%i Farenheit in Celsius is %i\n", F, F - 32 / 1.8); //32/1.8 gets operated first
因此,在您的第一个版本中,您始终可以获得
F-17.778

/
部分的优先级高于
-
。退房

您遇到的另一个问题是
C
int
类型。因此,使用
%i
打印它适用于第二个版本:

int F = 120, C;

C = (F-32)/1.8; //C is int, so the result is rounded here
printf("%i Farenheit in Celsius is %i\n", F, C); //printing int with %i is OK
但请注意,在您的第一个版本中,
F-32/1.8
的结果将类型提升为浮点(如
float/double
),但您正在尝试使用
%i
格式打印浮点

printf("%i Farenheit in Celsius is %i\n", F, F - 32 / 1.8);
//The F - 32 / 1.8 expression here is 
//int - int / double -> resulting in double type
//but you print double type with %i -> does not match
解决方案:使用括号并将打印格式更改为
%f
以打印浮点:

printf("%i Farenheit in Celsius is %f\n", F, (F - 32) / 1.8); //note the %f

这是因为在第一个版本中,在
F-…
中将结果减为
F
之前,必须执行
32/1.8

printf("%i Farenheit in Celsius is %i\n", F, F - 32 / 1.8); //32/1.8 gets operated first
因此,在您的第一个版本中,您始终可以获得
F-17.778

/
部分的优先级高于
-
。退房

您遇到的另一个问题是
C
int
类型。因此,使用
%i
打印它适用于第二个版本:

int F = 120, C;

C = (F-32)/1.8; //C is int, so the result is rounded here
printf("%i Farenheit in Celsius is %i\n", F, C); //printing int with %i is OK
但请注意,在您的第一个版本中,
F-32/1.8
的结果将类型提升为浮点(如
float/double
),但您正在尝试使用
%i
格式打印浮点

printf("%i Farenheit in Celsius is %i\n", F, F - 32 / 1.8);
//The F - 32 / 1.8 expression here is 
//int - int / double -> resulting in double type
//but you print double type with %i -> does not match
解决方案:使用括号并将打印格式更改为
%f
以打印浮点:

printf("%i Farenheit in Celsius is %f\n", F, (F - 32) / 1.8); //note the %f
问题在于:

F - 32 / 1.8
除法
/
比减法
-
具有更高的先例<首先计算代码>32/1.8
,然后从
F

你应该做的是:

(F - 32) / 1.8
问题在于:

F - 32 / 1.8
除法
/
比减法
-
具有更高的先例<首先计算代码>32/1.8
,然后从
F

你应该做的是:

(F - 32) / 1.8
使用
printf(“%i Farenheit in centrics是%i\n”,F,(F-32)/1.8)

编译器将
(F-32)/1.8的双值传递给函数
printf

它无法确定是否要传递
(F-32)/1.8
整数值

这是因为包含
“%i”
的参数仅在运行时分析

结果是未定义的,因为
printf
看到
“%i”
并从堆栈中加载
int

使用
printf(“%i Farenheit in centrics是%i\n”,F,(F-32)/1.8)

编译器将
(F-32)/1.8的双值传递给函数
printf

它无法确定是否要传递
(F-32)/1.8
整数值

这是因为包含
“%i”
的参数仅在运行时分析


结果是未定义的,因为
printf
看到
“%i”
并从堆栈中加载
int

提示:运算符前置提示:运算符前置即使有正确的括号,也不能给出正确的答案。有一次我运行这个程序,得到的结果是:-1040235848,然后是:-37143504,即使有正确的括号,也不能得到正确的答案。有一次我运行这个程序,得到的结果是:-1040235848,然后是:-37143504,即使有正确的括号,也不能得到正确的答案。有一次我运行这个程序,得到的结果是:-1040235848,然后是:-371432504@StevenLutz我解决了这个问题。我明白了,通过将输出打印为浮点,我每次都能得到正确的答案。然而,我不明白为什么。你能详细说明这个问题的原因吗?感谢you@StevenLutz不,它不是那样工作的。。。因为数字的整数和浮点表示是完全不同的表示。。。打印格式不进行截断-它们不同于赋值操作,如
inta=(double)b
。这个