This question already has answers here:
Why are these constructs using pre and post-increment undefined behavior?
                                
                                    (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

最佳答案

因为代码同时包含++pp++,所以它尝试修改p两次。

这些表达式出现在函数调用的参数中。 C标准未指定函数参数的评估顺序。

当程序尝试以无序方式两次修改对象时,程序将被破坏。 C 2011标准在第6.5节第2段中说,当对同一对象进行两个无序的修改时,C标准不会对程序的行为施加任何要求。

这意味着编译器不必使该程序以任何特定方式工作。编译器本质上是“放弃”并做任何偶然的事情。

10-08 04:22