【问题标题】:Ambigious Behaviour of various c++ Compilers各种 c++ 编译器的模棱两可的行为
【发布时间】:2020-03-19 09:12:00
【问题描述】:

当您在 Leetcode 上对 -ve 数字进行左移时,它会显示运行时错误,如下面的屏幕截图所示 leetcode compiler output

现在对于 GeeksForGeeks IDE 上的相同代码,它运行良好,如下所示 GFG IDE Output on same code

当我在代码块 IDE 上提交相同的代码时,会观察到相同的行为。我的问题是为什么输出中会出现这种歧义。请帮助,在阅读了关于 sof 上的 c++ 左移的各种帖子后,我感到非常困惑。详细的解释会很有帮助。

【问题讨论】:

  • 未定义的行为就是:未定义!请参阅cppreference - “对于负数 a,a
  • 看看here
  • 不要发布文字图片。将文本作为文本发布,

标签: c++ bit-manipulation bit-shift


【解决方案1】:

在 C、C++、Objective-C 中有“未定义的行为”和“实现定义的行为”。

“未定义的行为”意味着任何事情都可能发生。不仅仅是您认为合理或您期望的,而是任何东西。不要这样做。

“实现定义的行为”意味着你的编译器应该记录在这种情况下它会做什么。您阅读了编译器文档。不同的编译器可以以不同的方式做到这一点。

这个(负数左移)是未定义的行为。规则:不要这样做。不要抱怨结果。如果它在背后咬你,你只能怪你自己。

【讨论】:

    【解决方案2】:

    正如其他人所回答的,左移负符号值是 C++ 标准中未定义的行为。 不同的编译器会以不同的方式处理未定义的行为。

    例如,为您的代码使用编译器 g++ (GCC) 9.2.0:

    g++ test.cpp
    

    不会发出警告。

    但是你可以为编译器使用不同的选项,如果你打开所有警告并将警告视为 g++ 中的错误:

    g++ -W -Wall -Werror test.cpp
    

    编译器在编译代码时会报错。

    这些网站可能会使用不同的编译器和选项在其界面下划线,从而给出不同的结果。 如果您想了解有关编译器的更多信息,请抓住一个并离线尝试不同的选项。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2020-06-03
      相关资源
      最近更新 更多