变量定义阶段的自赋值操作是否会产生特殊效果?
结论
这行代码是典型的笔误,绝大多数场景下运行效果和你给出的第二段简化写法完全等价,不会产生额外特殊效果,你的猜测完全正确,就是把分开的声明和赋值合并时多写了一次a =导致的冗余写法。
详细说明
- 赋值运算符是右结合的,因此你遇到的代码:
实际执行逻辑等价于两步:uint16_t a = a = (uint16_t) (bPtr);- 先计算子表达式
a = (uint16_t) (bPtr),把指针强制转换后的uint16_t值写入变量a,该赋值表达式的返回值就是刚写入的这个值 - 再把上述返回值用来初始化刚声明的变量
a
- 先计算子表达式
- 两次写入的是同一个值,因此最终
a的存储值和直接写uint16_t a = (uint16_t) (bPtr);没有任何区别,这种写法不存在未定义行为,只是完全冗余没有必要。现代编译器开启优化后会直接把冗余的赋值删掉,生成的汇编代码和简化写法完全一致。 - 仅在极少数极端场景下(比如使用不符合C标准的老旧编译器、或者
a被特殊修饰符标记为volatile)会产生额外的写入操作,普通业务逻辑代码里几乎不会碰到这类场景。
内容的提问来源于stack exchange,提问作者endolith
相关产品推荐
相关产品推荐

