为什么 "j= 2 * 3 / 4 + 2.0 / 5 + 8/5;" 中的 j 值设置为 2 而不是 3?

Why is the value of j in "j= 2 * 3 / 4 + 2.0 / 5 + 8/5;" set to 2 and not 3?

在这个程序中,j被赋值为2

j = 2 * 3 / 4 + 2.0 / 5 + 8/5;

但如果用计算器计算相同的表达式,它会变成 3.5,所以在整数中它会变成 3。

我想问为什么j赋值给了2?我错过了什么?

C 程序:

#include <stdio.h>
int main()
{
    int i,j,k=0;
    int line=0;
    j = 2 * 3 / 4 + 2.0 / 5 + 8/5;
    printf(" %d --------- \n", j);
    k -= --j;
    printf(" %d --------- \n", k);
    for(i=0;i<5;i++)
    {
        switch(i+k)
        {
        case 1:
        case 2:
            printf("\n %d", i+k);
            line++;
        case 3:
            printf("\n %d", i+k);
            line++;
        default:
            printf("\n %d", i+k);
            line++;
        }
    }
    printf("\n %d", line);
    return 0;
}

输出为:

2 --------- 
-1 --------- 

-1
0
1
1
1
2
2
2
3
3
10
j= 2 * 3 / 4 + 2.0 / 5 + 8/5;

2 * 3 / 48 / 5是整数除法。

使用:

2 * 3 / 4.08 / 5.0 进行浮点除法。

类似于:

j= 2 * 3 / 4 + 2.0 / 5 + 8/5;

2 * 3 / 4 Produce 1 -> it's integer
2.0 / 5 Produce 0.4 -> float
8/5 Produce -> 1.6 -> but in integer 1

Sum: 1 + 0.4 + 1 -> 2.4 -> converted to integer it's 2.

你必须强制转换或换句话说它是浮点数,除以 2 个整数,产生整数。

让我们一步一步来分析:

2*3/4 + 2.0 /5 + 8/5   // 8/5 gives 1, not 1.6 because it's integer division

 6/4  +  0.4   + 1     // 2.0/5 is float division, so decimal place is left

 1    +  0.4   + 1     // 6/4 gives 1, not 1.5 because it's integer division

        2.4

        2             //part after decimal point removed since j is int
 2 * 3 / 4 + 2.0 / 5 + 8/5

*/ 是在 +- 之前计算的,这导致第 3 个步骤:

  1. 整数计算(所有操作数都是整数)

    2 * 3 / 4 = 6 / 4 = 1 
    
  2. 浮点数计算(至少有一个运算符是浮点数)

    2.0 / 5 = 2. / 5. = 0.4
    
  3. 整数计算(所有操作数都是整数)

    8 / 5 = 1
    

最后 (1. and 2. and 3.) 的结果是:

  1. 浮点数计算(至少有一个运算符是浮点数)

    1. + 0.4 + 1. = 2.4
    

分配给一个整数(向下截断)

int j = 2.4

导致 j 等于 2