【问题标题】:How to use `sizeof` operator inside the condition of for-loop properly? [closed]如何在for循环的条件下正确使用`sizeof`运算符? [关闭]
【发布时间】:2019-10-01 07:35:00
【问题描述】:

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&lt;(sizeof(a) 输出显示第一个 4 元素
  • i&lt;(sizeof(a))/(sizeof(a[0])) 输出仅显示第一个元素
  • 7直接用作条件时,而不是sizeof,它给出
    正确的输出,显示所有元素

【问题讨论】:

标签: c++ arrays function for-loop sizeof


【解决方案1】:

此答案适用于 用户...

根本不需要使用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&lt;(sizeof(a) 输出显示第一个 4 元素

    在这里,您正在执行size of(int*)指向 int 的指针),具体取决于 on the architecture 它可能是传出的。在您的情况下,它是 32 位机,这就是您获得 sizeof(a) = 4 的原因。

  • i &lt; 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;
}

【讨论】:

  • 虽然如果sizeof 不起作用,这意味着在OP 的实际代码中他们使用指针而不是arrya,所以std::size 也不起作用。
  • OP 更新了代码,实际上std::size 将像sizeof 一样“工作”(他们都没有)
【解决方案2】:

如果您在 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
}

【讨论】:

  • @JeJo 该声明是在我发布此答案后写的。而且我不知道 OP 想用这句话说什么。
  • 在我的最后一个示例中,OP 也可以使用sizeof(arr) 而不是N。没有任何区别。
  • true...但是在您的回答中N 更有意义。我的意思是,你可以在回答中提到它。
【解决方案3】:

您可以为此使用矢量。

vector<int> nums{1,2,3,4};
for(std::size_t i = 0; i < nums.size(); ++i)
  cout<<nums[i]<<endl;

如果你坚持使用int a[],你应该在遍历它之前知道它的大小。 顺便说一句,在 GCC 上

sizeof(nums) = sizeof(int) * total number of element

这不是元素的总数。

【讨论】:

  • 1) 不要将int 用于isize() 返回std::size_t,然后您将有符号类型int 与无符号类型std::size_t 进行比较,即一件坏事; 2) 在 C++11 中你可以这样做:for (auto&amp; x : nums) std::cout &lt;&lt; x &lt;&lt; std::endl;.
  • @Evg 你是对的
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多