关于运算符优先级/评估的C/C++编译器有多严格?

Dra*_*ord 3 c c++ operators logical-operators

这个问题已经在我的脑海中浮现了一段时间,所以有时间让它出来,看看你们有什么话要说.

在C/C++中,运算符优先级由C规范定义,但与所有内容一样,可能存在后门程序或未知/未知的事情,编译器可能会以"优化"的名义使用这些内容,最终会使应用程序陷入困境.

举个简单的例子:

bool CheckStringPtr(const char* textData)
{
    return (!textData || textData[0]==(char)0);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我测试指针是否为null 然后我检查第一个char是零,实质上这是一个零长度字符串的测试.从逻辑上讲,这两个操作是可交换的,但如果在某些情况下会发生这种情况,那么它会崩溃,因为它试图读取一个不存在的内存地址.

所以问题是:是否存在执行操作符/函数执行顺序的任何操作,我知道最安全的方法是使用彼此之下的2个IF,但这种方式应该是相同的,假设操作符的评估顺序永远不会更改.那么C/C++规范强制要求的编译器不会改变评估的顺序,或者它们有时会被允许更改顺序,就像它依赖于编译器参数,特别是优化一样?

Oli*_*rth 11

首先请注意,优先级评估顺序是两个不同的(很大程度上不相关的)概念.

那么C/C++规范强制要求编译器不改变评估顺序吗?

编译器必须生成与C语言标准保证的行为一致的行为.只要整体观察到的行为不变,就可以自由地改变评估顺序.

从逻辑上讲,这2个操作是可以交换的,但如果在某些情况下会发生这种情况,它就会崩溃

||并被&&定义为具有短路语义; 他们可能不会互换.