C这种用法是不科学的,错误的
C语言标准中明确指出了这种写法会导致*未定义行为(Undefined Behavior)*
按照过去的序列点解释,C语言表达式的副作用和求职都会在序列点前完成,两个序列点直接副作用发生的顺序和求值顺序取决于具体的编译器实现,不同实现会引起不同的结果,针对楼主的这个写法,VS,gcc,clang编译后运行的结果都是不同的,纠结这个问题没有意义,通过查看反汇编可以探究不同编译器的实现策略
大体来说,VS采用了从右向左计算的求值策略,gcc使用了先进行双目运算再进行弹幕运算的运算策略,这两种策略的结果不同,但都是符合语言标准的行为 |