按位或的评估顺序

时间:2019-04-13 18:13:32

标签: c++ c

考虑以下代码:

#include <stdint.h>
#include <vector>
#include <iostream>
int main()
{
    typedef std::vector<uint8_t> rawbytes;
    rawbytes data({0xaa,0xbb,0xcc,0xdd});
    rawbytes::iterator data_it = data.begin();

    uint32_t as_int = (*data_it++ << 24 ) | ( *data_it++ << 16 ) | ( *data_it++ << 8 ) | *data_it++;     

    std::cout << std::hex << as_int << std::endl;
}

此代码的输出是我所期望的:

aabbccdd

实际上,我编写了类似的代码,但我意识到我不确定它是否一定能正常工作。

我的疑虑摆在首位

uint32_t as_int = (*data_it++ << 24 ) | ( *data_it++ << 16 ) | ( *data_it++ << 8 ) | *data_it++;

如果可以保证从左到右执行评估,那么这意味着顺序吗? :

1: (*data_it++ << 24 )
2: (*data_it++ << 16 )
3: (*data_it++ << 8 )
4: *data_it++

我的理解如下: 来自“ |”从操作员的角度来看,先执行操作员的哪一方都没有关系。 因此,这意味着该代码按预期运行,但实际上是偶然的。

所以我的问题是,如果可以保证,为什么?

1 个答案:

答案 0 :(得分:6)

没有这样的保证。

与表弟||不同,| 不是测序点。

程序的行为是不确定的。