这个问题在我脑海里已经有一段时间了,所以有时间把它说出来,看看你们对此有什么看法。
在 C/C++ 中,运算符优先级由 C 规范定义,但与所有内容一样,编译器可能会以“优化”的名义使用后门或未知/不为人知的东西,最终会弄乱你的应用程序。
举个简单的例子:
bool CheckStringPtr(const char* textData)
{
return (!textData || textData[0]==(char)0);
}
在这种情况下,我测试指针是否为空,然后检查第一个字符是否为零,本质上这是对零长度字符串的测试。从逻辑上讲,这两个操作是可交换的,但如果在某些情况下发生这种情况,它会崩溃,因为它试图读取一个不存在的内存地址。
所以问题是:是否有任何东西可以强制执行运算符/函数的执行顺序,我知道最安全的方法是使用彼此下方的 2 个 IF,但假设运算符的评估顺序永远不会,这种方式应该是相同的改变。那么 C/C++ 规范是否强制编译器不更改评估顺序,或者有时允许它们更改顺序,比如它取决于编译器参数,尤其是优化?