c++ - C/C++ 编译器对运算符优先级/求值有多严格?

标签 c++ c operators logical-operators

<分区>

这个问题在我脑海里已经有一段时间了,所以有时间把它说出来,看看你们有什么要说的。

在 C/C++ 中,运算符优先级由 C 规范定义,但与所有内容一样,编译器可能会以“优化”的名义使用后门或未知/不为人知的东西,这会弄乱你的应用程序结束。

举个简单的例子:

bool CheckStringPtr(const char* textData)
{
    return (!textData || textData[0]==(char)0);
}

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

所以问题是:是否有任何东西强制执行运算符/函数的执行顺序,我知道最安全的方法是在彼此下面使用 2 个 IF,但这种方法应该是相同的假设运算符的评估顺序永远不会改变。 那么,C/C++ 规范是否强制编译器不更改求值顺序,或者它们有时是否允许更改顺序,比如它取决于编译器参数,尤其是优化?

最佳答案

首先请注意,优先级求值顺序 是两个不同(基本上不相关)的概念。

So are compilers forced by the C/C++ specification to not change the order of evaluation?

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

Logically the 2 operations are exchangeable but if that would happen in some cases it would crash

||&& 被定义为具有 short-circuit语义;它们不能互换。

关于c++ - C/C++ 编译器对运算符优先级/求值有多严格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19368536/

相关文章:

c - 理解代码: function in struct时出现问题

c - 如果链接描述文件中未定义部分,则虚拟内存地址错误

ios - 逻辑二进制中缀运算符出错

c++ - 多个新对象具有相同的指针地址

c++ - 将一个对象发送到另一个对象并调用第一个对象方法

c# - 在 cocos2d-x wp8-xaml 中从 c++ 代码调用 c# 委托(delegate)

c++ - 如何使用 XCode IDE 通过 SFML 中的相对路径加载图像

c - 如何调用计算整数中位数的函数

javascript - "+"在我的函数中表现奇怪

c++ - 四向等价