Sha*_*uri -1 c undefined-behavior pre-increment post-increment
今天我重新审视了Pre Increment和Post Increment.
我知道的基本定义.
预增量 - 增加值并返回值.
后递增 - 递增值并在递增之前返回值.
但是做一些他们的组合我很难过.
使用基本的C程序,这是我测试的.
最初i = 0.
第一次测试
printf("%d %d",++i,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 2
Run Code Online (Sandbox Code Playgroud)
我期望:
1 2
Run Code Online (Sandbox Code Playgroud)
第二次测试
printf("%d %d",i++,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 0
Run Code Online (Sandbox Code Playgroud)
我期望:
0 1
Run Code Online (Sandbox Code Playgroud)
第三次测试
printf("%d %d",i++,++i);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
1 2
Run Code Online (Sandbox Code Playgroud)
我期望:
0 2
Run Code Online (Sandbox Code Playgroud)
第四次测试
printf("%d %d",++i,i++);
Run Code Online (Sandbox Code Playgroud)
输出继电器:
2 0
Run Code Online (Sandbox Code Playgroud)
我期望:
1 1
Run Code Online (Sandbox Code Playgroud)
我认为评估可能来自右侧或左侧.在Post增量的情况下,如果是Pre Increment,则可能是左边的.也许Pre Increment的优先级高于Post增量.一些与结果相匹配的想法,但在一次测试中做出的假设并不能解释其他输出.
您拥有的所有内容都是未定义的行为,因为您在同一对序列点之间多次修改同一个变量.例如
i = i++;
Run Code Online (Sandbox Code Playgroud)
也是未定义的.有一个更深入的讨论在这里,有一个不错的SlideShare上覆盖此更"深C"怪癖.
另一个问题是评估顺序.参数以未指定的顺序进行评估,如果有的话
f(a(), b(), c());
Run Code Online (Sandbox Code Playgroud)
它可以调用a,b以及c以任何顺序.
你正在混合未定义的行为和未指定的行为,所以尽管你可以冒险猜测你为什么得到你所做的输出,但由于它是随机的,所以很难给出令人满意的解释.
| 归档时间: |
|
| 查看次数: |
789 次 |
| 最近记录: |