【问题标题】:Why this C++ program complies and runs in CodeBlocks [duplicate]为什么这个 C++ 程序符合并在 CodeBlocks 中运行 [重复]
【发布时间】:2023-03-15 13:23:02
【问题描述】:
#include <iostream>
using namespace std;

int main()
{
        cout<<"started "<<endl;
        int n= -2;
        int array[n];

        array[0]=100;
        array[1]=200;

        cout<<array[0]<<endl;
        cout<<array[1]<<endl;

        cout<<"over"<<endl;

        return 0;
}

为什么会编译和运行?我预计会出现编译错误,因为 n 的值为负数。

【问题讨论】:

  • 为什么重要?如果您知道这是错误的并产生未定义的行为,请不要这样做。
  • 即使n 是肯定的,它也不是有效的 C++。
  • @PaulMcKenzie,C++14 支持 VLA。
  • @BrianCain 需要引用。
  • @BrianCain,不,他们被拉进了 TS。

标签: c++ compiler-errors


【解决方案1】:

可变长度数组不是 C++ 特性,因此该行将导致编译器出现编译错误,该编译器严格遵守 C++ 规范,无论 n 的值如何(除非 n 是 @ 987654323@,可以在编译时确定):

int array[n];

您可能正在使用支持可变长度数组作为扩展的编译器。因此,关于什么是有效的规则完全取决于特定的编译器和编译器选项,并且您使用此扩展编写的任何代码都不能移植到不支持此非标准功能的编译器。

【讨论】:

  • 我正在使用最新版本的 CodeBlock 和 MinGW
  • @alalamin 然后您使用的是 g++,它确实支持 VLA。但是,我强烈建议您避免使用它们,因为您的代码可能无法在任何其他编译器上运行。如果你需要一个在编译时不知道其大小的数组,那么你应该使用std::vector
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多