代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

STD:T+St+C++8的11个奇怪输出

  •  -3
  • kmario23 Mazdak  · 技术社区  · 6 年前

    我有一个C++代码的小片段:

    #include <array>
    #include <string>
    #include <iostream>
    
    int main() 
    {
      std::string name = "mario";
      std::cerr << "Hello world! " + name + "\n";
    
      std::array<float, 4> arr = {12, 12.3, 13, 14};
      std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
      std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
      return 0;
    }
    

    它编译并输出以下内容:

    work ❯ c++ -std=c++11 -o hello_world hello.cpp
    work ❯ ./hello_world
    Hello world! mario
    first item is: 12.000000
    last item is: 0.000000
    

    但是,如果我把前两行注释掉,比如:

    #include <array>
    #include <string>
    #include <iostream>
    
    int main() 
    {
      //std::string name = "mario";
      //std::cerr << "Hello world! " + name + "\n";
    
      std::array<float, 4> arr = {12, 12.3, 13, 14};
      std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
      std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
      return 0;
    }
    

    编译并运行它。然后输出如下:

    work ❯ c++ -std=c++11 -o hello_world hello.cpp
    work ❯ ./hello_world
    first item is: 12.000000
    last item is: 12.000000
    

    我有三个问题:

    1. 为什么在第一种情况下,当使用 arr[-1] ?
    2. 为什么在第二种情况下使用 ARR〔1〕 ?
    3. 为什么我们得到不同的输出 ARR〔1〕 在第二种情况下,当我们评论前两个陈述时?

    编辑 :根据评论,我理解 ARR〔1〕 将是未定义的行为,因此在第一种情况下返回0.000。但是,注释掉其他语句如何改变这种行为呢?这让我完全困惑,因为我来自python世界。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Remy Lebeau    6 年前

    这是因为 Undefined behavior 作为 std::array::operator[] 不执行任何边界检查,并且您正在访问不存在的内容。

    STD::数组::操作符[] 返回对位于的元素的引用 指定位置。不执行边界检查。

    因此,无论你改变或评论什么,ub仍然是ub。