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];
请问为什么vc报错说不能用变量定义数组?不是可以吗?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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++语法标准。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 3无用
悬赏问题
- ¥20 有没有人会这个东西的
- ¥15 cfx考虑调整“enforce system memory limit”参数的设置
- ¥30 航迹分离,航迹增强,误差分析
- ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
- ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
- ¥15 LLM accuracy检测
- ¥15 pycharm添加远程解释器报错
- ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
- ¥15 如何能达到用ping0.cc检测成这样?如图
- ¥15 关于#DMA固件#的问题,请各位专家解答!