【问题标题】:What does this line of code mean这行代码是什么意思
【发布时间】:2017-06-27 03:48:16
【问题描述】:

C++ 11 及之后的版本有很多变化。我刚刚遇到这行代码,我以为我创建了一个默认为零的空数组,我只是在数组的开头添加了一个元素,即 99。但它打印出 42。我真的很困惑。

int a1 []{};
a1[0] = 99;
cout<<"a1 is " << a1[0];

控制台:

a1 is 42

【问题讨论】:

  • int a1 []{}; 不是 C++ 中的有效声明。代码无效。如果您设法编译并运行它,请将问题指向编译器的作者(或至少在此处指定您使用的编译器)。无论如何,这与 C++ 语言无关,C++11 与否。
  • 未定义的行为会产生未定义的结果。
  • 唯一的 C++11-ish 是 =int a1 []{}; 中的缺失。其他所有内容,包括非法/特定于供应商的部分,在 C++11 之前都是如此。
  • 我很想知道为什么UB打印出生命的意义,虽然.....

标签: c++ c++11 c++14


【解决方案1】:

这不是标准的 C++ 程序。 C 和 C++ 中不允许使用零大小的数组。如果您使用g++ & clang++ 编译器来严格确认标准并禁用任何编译器扩展,则应使用-pedantic-errors 命令行选项。

查看现场演示hereClang++

source_file.cpp:7:14: error: zero size arrays are an extension [-Werror,-Wzero-length-array]
    int a1 []{};
             ^
1 error generated.

【讨论】:

    【解决方案2】:

    如果你用g++ -std=c++11 -pedantic -W -Wall编译那个代码,你会得到一个错误:

    test.cpp:6:12: error: zero-size array ‘a1’
      int a1 []{};
    

    此代码无效。

    作为扩展,一些编译器提供(在不太兼容的模式下)零大小的数组。在这种情况下,您只需读取/写入与空数组相邻的字节,这恰好不会崩溃......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多