无法弄清楚编译器进行计算的方式

时间:2013-11-17 11:27:14

标签: c

鉴于是一个C代码,其中我试图弄清楚计算顺序将如何进行,我认为它应该是先3/2然后* 5或反过来。但它会产生意想不到的输出

  

5.000000

#include <stdio.h>

int main(void) {
    // your code goes here
    float a = 3/2*5;
    printf("%f", a);
    return 0;
}

4 个答案:

答案 0 :(得分:7)

这是预期的。

首先计算3/2(作为整数),将其截断为1.然后乘以5。

尝试在计算中将数字转换为(浮动) - 然后您将获得预期的答案。

正如damienfrancois所建议的那样,您也可以让编译器将它们视为浮点数,如下所示:

float a = 3.0/2.0*5;

通常,如果您没有给出任何指示(例如.0或强制转换),编译器会将数字视为整数

答案 1 :(得分:4)

该行

float a = 3/2*5;

a计算为3乘2的整数除法,即1,然后乘以5并转换为float。

将其替换为

double a = 3.0/2.0*5;

float a = 3.0f/2.0f*5;

你会得到7.500000

答案 2 :(得分:1)

它将整数3除以整数2,然后乘以整数5,然后转换为浮点数。

尝试float a = 3.f/2*5;

答案 3 :(得分:0)

乘法和除法运算符在评估中具有相同的优先级。由于两个运算符都是从左到右关联的,因此首先执行整数除法(3/2),得到1,然后乘以5.乘以C语言中的运算符关联性读取

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence