You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C语言赋值与复合赋值运算符优先级的困惑求解

问题解答:赋值运算符的优先级与结合性误区

你这里的核心错误是对赋值运算符的优先级和结合性认知有误,咱们一步步拆解清楚:

首先看你的代码:

#include <stdint.h>
void foo(uint32_t *pVal) {
    uint32_t i = 8;
    *pVal = i *= 10;
}

你提到查到的资料说=的优先级高于*=,这是错误的——在C语言中,复合赋值运算符(比如*=、+=这类)的优先级实际上比简单赋值=更高,而且所有赋值运算符都遵循右结合的规则(也就是多个赋值连用时,会从右往左依次计算)。

所以*pVal = i *= 10;会被编译器解析成:

*pVal = (i *= 10);

具体运算过程:

  1. 先执行i *= 10:等价于i = i * 10,i的初始值是8,计算后i变为80,同时这个表达式的返回值也是80;
  2. 再把这个返回值(80)赋值给*pVal,所以*pVal最终的值也是80。

这完全对应你贴出的汇编代码逻辑:

foo: # @foo
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov dword ptr [rbp - 12], 8
imul eax, dword ptr [rbp - 12], 10  ; 计算i*10,结果存到eax(值为80)
mov dword ptr [rbp - 12], eax       ; 把eax的值存回i,i变为80
mov rdi, qword ptr [rbp - 8]
mov dword ptr [rdi], eax            ; 把eax的值赋值给*pVal,*pVal变为80
pop rbp
ret

简单总结下关键要点:

  • 复合赋值运算符(*=、+=等)优先级 > 简单赋值=;
  • 所有赋值运算符都是右结合,多赋值连用时从右往左计算。

内容的提问来源于stack exchange,提问作者Alex Lop.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:38:29