其他答案已经指出了哪些方面<<
是未定义的行为。我的猜测是你想要将海湾合作委员会“翻译”成通用语言。
如果 C 标准未定义某个行为,则在发生这种情况时,编译器实现者可以采取“自由度”来执行适合他们的任何操作。特别是,他们不必对这种情况进行诊断或检测,并且可以假装它从未发生过。程序员有责任编写程序,使其行为始终得到定义。
在左移的情况下,这意味着编译器不必检查溢出,并且可以假装像这样的循环
for (int i = 1; i > 0; i <<= a) {
.... change a in some complicated way ...
}
Run Code Online (Sandbox Code Playgroud)
永远不会终止。
您引用的句子表明他们还没有这样做,但未来版本的 gcc 可能会这样做。