循环在此代码中仅迭代一次,而在另一个代码中它正确迭代
Posted
技术标签:
【中文标题】循环在此代码中仅迭代一次,而在另一个代码中它正确迭代【英文标题】:The loop iterates only once in this code while in another code it iterates properly 【发布时间】:2017-03-31 10:24:32 【问题描述】:为什么循环在这段代码中只运行一次?
// Example program
#include <iostream>
#include <string>
using namespace std;
int main()
int n=5;
int a[n];
for(int i=0;i<sizeof(a);i++)
cout<<"mohit jain"<<endl;
return 0;
而在代码中循环迭代了五次?
// Example program
#include <iostream>
#include <string>
using namespace std;
int main()
int a[5];
for(int i=0;i<sizeof(a);i++)
cout<<"mohit jain"<<endl;
return 0;
所以请告诉我为什么它在第一个代码中迭代一次而在第二个代码中迭代五次的正当理由。
【问题讨论】:
VLA 在 C++ 中是非标准的。 请注意 VLA 是一个可选的扩展。它的大小是运行时决定的,所以类型不同。 除非您的编译器损坏或做错了什么,否则它们都应该迭代 20 次(假设 sizeof(int) == 4)。见:ideone.com/2PUZRR 尝试在这两种情况下打印sizeof(a)
的值,然后找出差异(如果有)。
【参考方案1】:
考虑改用const int n = 5
。
默认情况下,C++ 不允许动态大小的数组(在这种情况下它是动态的,因为 n
是非常量的)。它之所以有效,只是因为您的编译器在这种情况下使用某种扩展来分配数组,例如gcc 的变量数组。
所以,第一个示例是非标准 C++ 代码,sizeof
返回 1 而不是 5 * sizeof(int)
的原因在于扩展的特定于编译器的实现。
顺便说一句,第二个循环运行 5 * sizeof(int)
次(在大多数系统上为 20 次),而不是 5 次。
【讨论】:
它们在任何当前版本的 g++ 上都运行了 20 次。 请更正您的答案并使其更通用,因为它不一定会运行 20 次,这取决于sizeof(int)
。 + 在OP的情况下,sizeof
的结果可能是实现定义的,所以甚至可能是sizeof(a)
实际返回值的5倍
它们都使用 Visual Studio v100 和 v120 编译器运行 20 次,假设 sizeof(int) = 4。此外,除非您不将 n 声明为 const 变量,否则该编译器的第一个代码是非法的。
我尝试了几个编译器并且能够在这个网站上重现 Mohit 的问题:cpp.sh
@AlexPetrenko:看起来 cpp.sh 使用的 g++ 版本(4.9.2 - 相当旧)在这方面存在错误 - 添加 const
出于某种原因修复了它。当前版本的 g++ 没有这个问题。以上是关于循环在此代码中仅迭代一次,而在另一个代码中它正确迭代的主要内容,如果未能解决你的问题,请参考以下文章