【问题标题】:Arrays-Problem with global integer declaration in CC 中全局整数声明的数组问题
【发布时间】:2020-09-18 14:52:02
【问题描述】:

完全是编程新手,目前正在关注 Youtube 上的 CS50 课程,所以我无法访问他们的 CS50 沙盒。我目前在讲关于数组的第 2 课。根据教授的说法,以下代码应该可以正常编译和运行,但是在我的 PC 上的 Visual Studio 2019 社区版上,我遇到了错误 C2057,预期为常量表达式;和错误 c2466,编译时无法分配常量大小为 0 的数组。

请帮助解释为什么在 CS50 在线沙盒中,这些代码可以,而在 VS 2019 中却不行?是我的代码写得不对,还是 VS2019 的工作方式与 CS50 沙盒不一样?我在某处读到 VS2019 与 C99 不兼容或类似的东西,这与手头的问题有关吗?

PS:今天还看到VS2019将支持C11和C17,这个新的更新会有帮助吗?

非常感谢!

这些是我的代码:

#include <stdio.h>

const int N = 5;

int main(void)
{
    double scores[N] = { 59, 60, 90, 85, 87 };
    double total_score = 0;
    for (int i = 0; i < N; i++)
    {
        
        total_score += scores[i];
    }
    double average = total_score / N;
    printf("Average score is : %.1f,", average);
}

【问题讨论】:

  • 如果您有 github 帐户,您应该能够使用 CS50 IDE (ide.cs50.io)
  • 感谢您的信息,我会尝试的。

标签: arrays c global-variables cs50


【解决方案1】:

代码需要 C99 功能的可变长度数组,因为即使 const int N 中的 const 表示常量,它实际上并不被视为 C 中的编译时常量。

不幸的是,即使是最近,MSVC 编译器也只实现了 30 年前 (!!) 带有一些扩展的 ISO C90 标准修订版,但没有实现可变长度数组。

您可以通过将 const int N 更改为预处理器宏来将此程序修复为 C89:

#define N 5

VS2019 将支持 C11,C17 对您没有一点帮助,因为由于 Microsoft 拒绝从 C99 实现可变长度数组,VLA 在 C11、C17 中已成为可选,并且据说 MSVC不会实现它们。

【讨论】:

  • 非常感谢您的澄清!所以在谷歌搜索之后,这是否意味着为了在这些代码中实现我的目标,我唯一能做的就是在我得到用户输入数组大小后执行 malloc() free() ?
  • @JackZha 是的,这是真的。但是,无论如何,在用户输入的情况下,malloc/free 是首选方式,因为如果 VLA 太大,那么您的程序将简单地崩溃而不是管理退出的可能性:D
【解决方案2】:

因为数组大小N 是一个变量而不是整数常量,所以数组scores 是一个可变长度数组 (VLA)。此类数组是 C99 标准的一部分,也是 C11 标准的可选功能。

但是,Visual Studio 不支持 VLA。您需要直接将值放在适当的位置,或者使用宏而不是变量:

#define N 5

这里需要注意的是,带有const 限定符的变量不符合常量表达式的条件。

【讨论】:

  • 感谢您的帮助!我会尝试这个解决方案。同时,我将开始学习每个人都高度评价的精彩 malloc() 函数。
【解决方案3】:

这个问题其实是混合的。

首先,const 变量实际上并不是编译时的常量,它们只是运行时的常量。

第二件事是,虽然 C 确实支持变长数组(大小在运行时设置的数组),但这样的数组不能被初始化。

因此,要么您需要为数组大小设置适当的编译时常量,通常定义为宏,然后您就可以像在程序中一样创建一个初始化数组。 或者你可以有一个可变长度的数组但是你不能初始化它。

CS50 沙盒使用的编译器似乎在使用某种扩展来使const 限定变量成为编译时常量,它允许初始化可变长度数组。

另一方面,Visual Studio 及其编译器会看到初始化并决定它不能是可变长度数组,在这种情况下,大小必须是编译时常量。因为不是,所以会报错。

【讨论】:

  • 感谢您的深入分析。我似乎在第 2 课上已经偶然发现了一些非常密集的低级知识。但这是非常有趣的东西!可惜 32 岁才找到自己真正热爱的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 2012-10-04
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多