回 帖 发 新 帖 刷新版面

主题:c语言萌新求大佬解惑

#include <stdio.h>

void main()
{
int j = 5, q;
q=(++j)+(++j)+(++j);
printf("%d,%d", q, j);

}

输出给我的结果是q的值为22,j的值为8

我怎么想也想不通,++j应该是先加1再运算,那么应该为6+7+8=21啊,怎么会给我输出22的结果呢?

回复列表 (共3个回复)

沙发


**计算表达式 `q = (++j) + (++j) + (++j)`**:
   在这个表达式中,`++j` 被多次使用。具体的计算顺序是不可预测的,因为 C 语言标准没有规定这些操作的顺序,编译器会按照其内部实现的规则来计算。

   对于这个特定的代码片段,大多数现代编译器会以特定的顺序来计算,但由于标准不保证顺序,我们要根据实际运行结果来分析。假设我们分析一个常见的计算顺序(可能与特定编译器实现有关):

   - **第一个 `++j`**:`j` 从 5 变成 6。
   - **第二个 `++j`**:`j` 从 6 变成 7。
   - **第三个 `++j`**:`j` 从 7 变成 8。

   在这些操作完成之后,表达式计算的顺序可能是:

   - 第一个 `++j` 结果为 6。
   - 第二个 `++j` 结果为 7。
   - 第三个 `++j` 结果为 8。

   因此,`q` 的计算可以是:
   ```c
   q = 6 + 7 + 8 = 21
   ```

   然而,通常编译器可能在计算时会有细微的不同行为,导致实际结果可能有所不同。例如,某些编译器可能先计算其中一个 `++j` 后计算其他的,导致稍微不同的结果。

   在你的具体例子中,`q` 的结果为 22,这表明编译器可能对计算顺序做了一些特殊处理。但最终的 `j` 的值是 8,因为每个 `++j` 都在递增 `j`。

### 结果解释

- `q` 的值是 22,说明在具体实现中,`++j` 的计算顺序和加法顺序可能使得结果为 22。
- `j` 的值是 8,因为每个 `++j` 操作都将 `j` 增加了 1。

### 总结

结果 `22, 8` 主要是因为编译器对 `++j` 操作的求值顺序可能与标准文档中的描述略有不同,导致了 `q` 的值为 22,但 `j` 的最终值明确是 8。由于这个行为与编译器的实现相关,实际情况可能在不同编译器和编译选项下有所不同。



板凳

不同测试结果

C (Clang 7.0.1)   结果 

21,8
C (GCC 8.3.0)   结果 
22,8




3 楼

这种属于未定义吧,在不同的编译环境下结果可能不一样

我来回复

您尚未登录,请登录后再回复。点此登录或注册