关于C语言赋值与复合赋值运算符优先级的困惑求解
问题解答:赋值运算符的优先级与结合性误区
你这里的核心错误是对赋值运算符的优先级和结合性认知有误,咱们一步步拆解清楚:
首先看你的代码:
#include <stdint.h> void foo(uint32_t *pVal) { uint32_t i = 8; *pVal = i *= 10; }
你提到查到的资料说=的优先级高于*=,这是错误的——在C语言中,复合赋值运算符(比如*=、+=这类)的优先级实际上比简单赋值=更高,而且所有赋值运算符都遵循右结合的规则(也就是多个赋值连用时,会从右往左依次计算)。
所以*pVal = i *= 10;会被编译器解析成:
*pVal = (i *= 10);
具体运算过程:
- 先执行
i *= 10:等价于i = i * 10,i的初始值是8,计算后i变为80,同时这个表达式的返回值也是80; - 再把这个返回值(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.
相关产品推荐
相关产品推荐

