如何编写C赋值语句,使x根据+操作数求值顺序赋值1或2
如何通过赋值语句判断+操作数的求值顺序
这问题挺有意思的——要利用C语言中+操作数求值顺序未指定的特性,让x根据左/右操作数谁先执行分别得到1或2。核心思路是用一个共享的状态变量,让第一个执行的操作数标记状态并返回目标值,第二个执行的操作数根据已标记的状态返回0,这样总和就等于第一个执行的操作数返回的1或2。
具体实现代码
static int order_flag = 0; x = (order_flag++ == 0 ? 1 : 0) + (order_flag == 1 ? 0 : 2);
为什么这样工作?
我们来拆解两种执行顺序的情况:
左操作数先执行:
- 初始
order_flag是0,order_flag++ == 0为真,左操作数返回1,同时order_flag被自增为1。 - 右操作数执行时,
order_flag已经是1,所以返回0。 - 最终
x = 1 + 0 = 1。
- 初始
右操作数先执行:
- 初始
order_flag是0,order_flag == 1为假,右操作数返回2。 - 左操作数执行时,
order_flag++ == 0为真,返回1,同时order_flag被自增为1。 - 最终
x = 1 + 2 = 2。
- 初始
注意事项
- 这里用
static变量是为了保证状态只初始化一次,如果是局部变量记得每次使用前重置order_flag为0。 - 这个程序的行为是**未指定(unspecified)**的,不是未定义行为——C标准允许编译器选择任意一种求值顺序,两种结果都是符合标准的,只是依赖具体编译器的实现。
内容的提问来源于stack exchange,提问作者yanyanep
相关产品推荐
相关产品推荐

