Cons. Marx 2021-08-21 10:45 采纳率: 92.3%
浏览 798
已结题

请问为什么vc报错说不能用变量定义数组?不是可以吗?

img


int a = 0, b = 0, c = 0, d = 0;
    temp = head;
    while (temp->next != NULL)
    {
        if (temp->mscore > h && temp->kscore > h)//德才兼备 
        {
            a++;
        }
        else if (temp->mscore > h && temp->kscore < h)//德胜才 
        {
            b++;
        }
        else if (temp->mscore > temp->kscore && temp->mscore < h)//“才德兼亡”但尚有"德胜才"
        {
            c++;
        }
        else if (temp->kscore > temp->mscore && temp->kscore < h)//其他 
        {
            d++;
        }
        temp = temp->next;
    }
    int a1 = 0, b1 = 0, c1 = 0, d1 = 0;
    struct cnt A[a], B[b], C[c], D[d];
  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-08-21 11:51
    关注

    你用的这个语法叫做VLA,变长数组。但这个是C的语法,不是C++的语法。你的文件是.cpp后缀,会被当做C++源码来处理。
    几点补充:
    1、有人声称C++是C的派生物所以兼容C,但这种想法是完全错误的!现代C++已经在很多细节上不再兼容C了,例如auto。
    2、由于第一条,有人声称C语言可以用.cpp后缀时,不要信。C++和C在当下已经是两种完全不同的语言,不能通用,即便是GCC也存在这样的情况。举例而言,GCC下C和C++编译器对于类型转换检查的严格程度有着巨大的差别,对于相同语义的相同代码也有着截然不同的处理。
    3、事实上很多工程师对VLA抱有反对态度,我个人也是。因为根据我搜索的材料,似乎VLA的安全性和具体实现完全没有任何保证。最基本的,VLA不能保证任何合法性检查,没有任何可能进行的容错措施,没有任何(行为上的)可移植性保障。这意味着任何使用VLA的程序都必须严格地进行手动容错,而且书写者必须熟悉OS和硬件如何实现栈以免栈段溢出。因此,VLA在大型工程上恐怕是个糟糕的主意。然而,由于不当的操作导致VLA崩溃的情形并不多见(事实上,绝大多数的致命故障触发的条件都很苛刻),因此也有人坚持使用VLA,但总之VLA在C中也争议巨大。
    4、从C++的角度而言,事实上VLA并不好用且违反直觉,只有新手中的新手才会觉得VLA好用,任何熟悉C++的工程师都会觉得VLA十分怪诞。理由非常简单:C++是一门通过编译期推导和计算提升性能的语言,VLA这种动态类型的想法从根本上违背了C++的设计理念。(可能有人会反对说C++也存在auto和模板等类型语法,但我不得不强调:这些语法都是编译期的静态类型推导,而不是运行期推导。)最简单的,VLA本质上不像malloc那样属于直接操作指针的东西,但它也不是正规数组,这意味着本来应该在编译期进行计算的sizeof将无法在编译期得到结果。这有几种解决方案:第一种,返回指针长度,问题是它也不是指针,事实上VLA根本不存在任何可在编译期推导的类型;第二种,像常规数组一样返回数组的总字节长度,但我们已经提到这实际上是不可能在编译期做到的;第三种,直接对VLA的sizeof报错。无论是哪种解决方案都十分怪诞,需要放弃甚至对抗C++的其他原生语义语法才能做到,需要强迫其他工程师放弃固有的C++式“能在编译期完成的都要在编译期完成”的语言逻辑才能迎合那些喜欢VLA的工程师,我想这样的代价并不容易接受。这恐怕也解释了C++标准委员会为何一直没能将VLA纳入C++语法标准。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月31日
  • 已采纳回答 8月23日
  • 创建了问题 8月21日

悬赏问题

  • ¥15 爬取豆瓣电影相关处理
  • ¥15 手机淘宝抓清除消息接口
  • ¥15 C#无selenium
  • ¥15 LD衰减计算的结果过大
  • ¥15 用机器学习方法帮助保险公司预测哪些是欺诈行为
  • ¥15 计算300m以内的LD衰减
  • ¥15 数据爬取,python
  • ¥15 怎么看 cst中一个面的功率分布图,请说明详细步骤。类似下图
  • ¥15 为什么我的pycharm无法用pyqt6的QtWebEngine
  • ¥15 FOR循环语句显示查询超过300S错误怎么办