for循环的条件是否总是需要常数?
如何在其中放置sizeof
函数以运行显示数组所有元素的输出?
#include<iostream>
using namespace std;
void array_output(int a[])
{
for (int i = 0; i < (sizeof(a)) / (sizeof(a[0])); i++)
{
cout << a[i] << endl;
}
}
int main()
{
int a[] = { 22, 53, 13, 65, 80, 31, 46 };
array_output(a);
return 0;
}
i<(sizeof(a)
输出显示第一个 4
元素 i<(sizeof(a))/(sizeof(a[0]))
输出仅显示第一个元素 sizeof
作为条件时,而不是7
,它给出了答案 0 :(得分:4)
† (此答案适用于c++17个用户... )
根本不需要使用sizeof
运算符的地方。
改用 std::size()
函数,该函数将为您提供给定容器或数组的大小。
#include <iostream>
#include <iterator> // std::size
#include <cstddef> // std::size_t
int main()
{
int a[]{ 22,53,13,65,80,31,46 };
for (std::size_t i = 0; i < std::size(a); i++)
{
std::cout << a[i] << `\n`;
}
}
OP在发布此答案后编辑了问题,
std::size
无法应用的地方。
当数组a
传递给void array_output(int a[])
时,它被推导为void array_output(int* a)
而不是其实际类型为int a[7]
。
i<(sizeof(a)
输出显示前4
个元素
在这里,您正在做size of(int*)
(32
位计算机,这就是您获得sizeof(a) = 4
的原因。
i < sizeof(a)/ sizeof(a[0])
输出仅显示第一个元素
将等于sizeof(a)
个字节的sizeof(int*
(即4
)相除
sizeof(a[0])
(也就是sizeof(int)
,也就是4
个字节)中的机器),只能是一个,并且只循环一次。
@Timo 的
答案,提供一个模板化函数,其中size将是非类型的模板参数,可以直接访问而无需使用sizeof
。
如何将
sizeof
放到函数中并运行显示所有 数组的元素?
仅当实际传递实际类型的数组a
时,这仅是可能的。
为此,通过完美转发让数组推导为其int [7]
。
#include<iostream>
template<typename Type>
void array_output(Type&& a) // deduced to `int a[7]`
{
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { // or std::size(a)
std::cout << a[i] << '\n';
}
}
int main()
{
int a[] = { 22, 53, 13, 65, 80, 31, 46 };
array_output(a);
return 0;
}
答案 1 :(得分:1)
您可以为此使用矢量。
vector<int> nums{1,2,3,4};
for(std::size_t i = 0; i < nums.size(); ++i)
cout<<nums[i]<<endl;
如果您坚持使用int a [],则在遍历它之前应该知道它的大小。 顺便说一句,在海湾合作委员会上
sizeof(nums) = sizeof(int) * total number of element
不是元素总数。
答案 2 :(得分:1)
如果您在sizeof
运算符中使用实际数组,则将获得该数组的大小(以字节为单位),这意味着您可以使用sizeof(array) / sizeof(array_type)
计算出所需元素的数量。
int x[] = {1, 1, 1, 1, 1, 1};
int sum = 0;
for (int i = 0; i < sizeof(x) / sizeof(int); i++)
sum += x[i];
// sum == 6
但是,如果将数组作为函数参数传递,则会遇到指针衰减。这意味着数组大小信息将会丢失,而您将获得指针大小,这就是您描述的行为。
int sum(int arr[]) // arr decays to int*
{
int sum = 0;
for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
sum += arr[i];
return sum;
}
int main()
{
int x[] = {1, 1, 1, 1, 1, 1};
return sum(x); // will return 1 or 2, depending on architecture
}
如果使用模板函数,仍可以在函数中获取数组大小。
#include <cstddef>
template <std::size_t N>
int sum(int (&arr)[N])
{
int sum = 0;
for (int i = 0; i < N; i++)
sum += arr[i];
return sum;
}
int main()
{
int x[] = {1, 1, 1, 1, 1, 1};
return sum(x); // will return 6
}