目录
在C语言中,求值顺序(order of evaluation)是一个容易引发语义陷阱的重要方面。C语言标准并未严格规定函数参数、运算符操作数以及某些复合表达式中各个子表达式的求值顺序,这意味着编译器在实现时可以自由选择求值顺序。然而,这种灵活性有时会导致程序的行为在不同编译器或同一编译器的不同优化级别下表现不一致,甚至引发未定义行为。
一、求值顺序的不确定性
在C语言中,除了函数参数和某些特定的操作符(如逻辑与&&
和逻辑或||
,它们规定了短路求值)之外,大多数表达式的求值顺序是未指定的。这意味着编译器在编译代码时,可以自由地选择各个子表达式的求值顺序。
1.1. 函数参数的求值顺序
在C语言中,函数参数的求值顺序是未指定的。这意味着当调用一个函数时,编译器可以选择先求值哪个参数,后求值哪