首页 > 解决方案 > arr[0] = arr[1] = C 中的值是不好的做法吗?

问题描述

正如我上面所说,这是不好的做法吗?在 ASM 中它会是什么样子?我的意思是,我不知道它是否被翻译成这样的东西:

arr[0] = value;
arr[1] = value;

或者是这样的:

arr[1] = value;
arr[0] = arr[1];

第二个显然效率更低(imm vs mem)。

提前致谢。

标签: coperatorsoperator-precedenceassignment-operator

解决方案


根据 C 语法赋值运算符从右到左求值。

所以这个说法

arr[0] = arr[1] = value;

相当于

arr[0] = ( arr[1] = value );

来自 C 标准(6.5.16 赋值运算符)

3 赋值运算符将值存储在左操作数指定的对象中。赋值表达式在赋值后具有左操作数的值,111) 但不是左值。赋值表达式的类型是左操作数在左值转换后的类型。更新左操作数的存储值的副作用是在左操作数和右操作数的值计算之后排序的。操作数的评估是无序的。

所以根据报价你可以考虑这个声明

arr[0] = arr[1] = value;

喜欢

arr[1] = value;
arr[0] = arr[1];

至于效率,编译器可以生成与您想象的源代码不同的高效目标代码。


推荐阅读