这里是我的代码从一个字节数组反序列化uint64_t中值:编译器警告有关未定义操作
uint8_t* s = blah;
uint64_t output =
(((uint64_t)*s++) << 56) +
(((uint64_t)*s++) << 48) +
(((uint64_t)*s++) << 40) +
(((uint64_t)*s++) << 32) +
(((uint64_t)*s++) << 24) +
(((uint64_t)*s++) << 16) +
(((uint64_t)*s++) << 8) +
(((uint64_t)*s) );
我编译此代码使用g ++在Ubuntu版本5.4。
虽然代码工作完全按照预期,我得到的最后一行编译时警告:
warning: operation on 's' may be undefined [-Wsequence-point]
想知道什么可能是错误的,我怎么能解决这个问题。问候。
可能的重复https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points –
各种's ++'子表达式的评估顺序是未指定的。在这种情况下,同一个对象被多次修改,这个标准不仅仅是说它们可以以任何顺序被评估(这足够糟糕),并且说行为是完全不确定的。 –
任何你不使用简单循环的理由?让编译器进行展开。 – Olaf