来自 cppreference:
在前一个和下一个序列点之间,标量对象必须通过表达式的计算最多修改一次其存储的值,否则行为是未定义的。
代码示例:
int a = store_and_return_value(&a);
Run Code Online (Sandbox Code Playgroud)
对于 C 和 C++。
int a = scanf("%d", &a);不表现出未定义的行为。
这些是明确定义的步骤:
int在堆栈上创建一个变量,名为a
scanf从标准输入读取一个值a
scanf返回一个值
该返回值被分配给a。
的最终值a由 的返回值决定scanf,要么是 1(如果该变量a读取成功),要么是 0(读取失败)。
编辑:
答案是在问题编辑之前写的
int a = store_and_return_value(&a);
同样的道理也适用于此。