我在运行公式时得到随机答案:
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;
}
一致并给出了正确的答案。 为什么第一个版本没有正常工作?
答案 0 :(得分:4)
这是因为在您的第一个版本中,您在将结果缩减到32/1.8
中的F
之前执行F - ...
:
printf("%i Farenheit in Celsius is %i\n", F, F - 32 / 1.8); //32/1.8 gets operated first
因此,您在第一个版本中始终获得F - 17.777777778
。
/
分区的优先级高于-
。检查this。
您遇到的另一个问题是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
答案 1 :(得分:0)
这是因为除法运算符"/"
的优先级高于减法运算符"-"
,在您使用的第一个示例中,不使用括号因此首先进行除法,您可以将代码更改为:< / p>
printf("%f Farenheit in Celsius is %f\n", F, (F - 32) / 1.8);
它会完美运作。
答案 2 :(得分:0)
对浮点数使用格式规范%i
是未定义行为的原因。使用%f
。
printf("%i Farenheit in Celsius is %f\n", F, (F - 32) / 1.8);
^^^
在第二种情况下,您在使用时截断数字:
C = (F-32)/1.8;
第二个printf
打印截断的数字,因为您使用%i
C
,int
。
答案 3 :(得分:0)
问题在于:
RedirectMatch ^/(.+\.html).+$ /$1
分部RewriteEngine on
RewriteCond %{THE_REQUEST} /xyz\.cgi\?page=(.+\.html).+\sHTTP [NC]
RewriteRule ^ /xyz.cgi?page=%1 [L,R]
的先例高于减号F - 32 / 1.8
。首先评估/
,然后从-
你应该做的是:
32/1.8
答案 4 :(得分:0)
使用printf("%i Farenheit in Celsius is %i\n", F, (F - 32) / 1.8);
:
编译器将(F - 32) / 1.8
的 double值传递给函数printf
。
无法确定您要传递(F - 32) / 1.8
的整数值。
这是因为包含"%i"
的参数仅在运行时解析。
结果未定义,因为printf
看到"%i"
并从堆栈加载int
。