来自C的论坛的随机输出

时间:2016-03-24 04:52:53

标签: 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 Celsius is %i\n", F, C);

    return 0;
}

一致并给出了正确的答案。 为什么第一个版本没有正常工作?

5 个答案:

答案 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 Cint

答案 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