This question already has answers here:
Why are these constructs using pre and post-increment undefined behavior?
(14个回答)
5年前关闭。
输出:
我已经阅读了下面的线程,但仍然无法找到为什么输出像“ l l h h”。任何人都可以回答。
Pointer expressions: *ptr++, *++ptr and ++*ptr。
(14个回答)
5年前关闭。
char* p = "hello"; printf(" %c %c %c %c", *p, *++p, *p++, *p);
输出:
l l h h
我已经阅读了下面的线程,但仍然无法找到为什么输出像“ l l h h”。任何人都可以回答。
Pointer expressions: *ptr++, *++ptr and ++*ptr。
最佳答案
因为代码同时包含++p
和p++
,所以它尝试修改p
两次。
这些表达式出现在函数调用的参数中。 C标准未指定函数参数的评估顺序。
当程序尝试以无序方式两次修改对象时,程序将被破坏。 C 2011标准在第6.5节第2段中说,当对同一对象进行两个无序的修改时,C标准不会对程序的行为施加任何要求。
这意味着编译器不必使该程序以任何特定方式工作。编译器本质上是“放弃”并做任何偶然的事情。
10-08 04:22