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
。这个