如何编写一个在c ++中迭代两个数组的for语句

时间:2015-02-18 18:07:39

标签: c++ arrays

我已经完成了一项任务,但Xcode正在给我一个关于for循环语法的警告,我不知道如何更改它。我是编程新手。我正在上一门课程。

赋值是创建两个char数组。一个月份名称,另一个月份的总天数,然后按顺序打印两个阵列(2月31日2月28日等)。

这就是我提出的:

f()
{
    std::string months[] = { "January", "February", "March" };
    std::string days[] = { "31", "28", "31" };

    stringstream ss;

    for (auto i = 0, j = 0; i < 3, j < 3; ++i, ++j)

    {
        ss << months[i] << " " << days[j] << " ";
    }

}

编译器不喜欢for语句的中间部分,测试要停止。我收到的消息说“表达结果未使用”。

我承认我主要模仿我从课堂上看过的样本,但我们从未做过评估两个数组的循环。我尝试了一个范围for循环,但我根本无法工作。

4 个答案:

答案 0 :(得分:6)

为什么要使用两个指数?只需编写一个常规循环:

    for (int i = 0; i < 3; ++i) {
        ss << months[i] << " " << days[i] << " ";
    }

答案 1 :(得分:4)

stringstream ss;

替换为std::ostringstream ss;

for (auto i = 0, j = 0; i < 3, j < 3; ++i, ++j)
{
    ss << months[i] << " " << days[j] << " ";
}

i < 3, j < 3中,使用逗号运算符。正如http://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator所说:

  

在逗号表达式E1, E2中,对表达式E1进行评估   返回值被丢弃,其副作用在之前完成   表达式E2的评估开始[...]。返回类型和值   逗号运算符的类别正是返回类型和值   第二个操作数的类别,E2

换句话说,i < 3部分被完全忽略(它也没有任何副作用),并且您的代码等同于for (auto i = 0, j = 0; j < 3; ++i, ++j)

以下是显示此行为的更简单示例:

#include <iostream>

int main()
{
    int i = 0;
    std::cout << (i != 0, i == 0);
}

这会打印1,因为只会考虑i == 0

对我来说,问题是:你到底想做什么?你想打印两个阵列吗?在这种情况下,您根本不需要两个不同的索引变量:

for (auto i = 0; i < 3; ++i)
{
    ss << months[i] << " " << days[i] << " ";
}

但仍有改进的余地。例如,您可能希望assert两个数组在迭代之前具有相同的大小,并且您可能希望摆脱循环中的幻数3

答案 2 :(得分:2)

改变这个:

i < 3, j < 3

到此:

i < 3 && j < 3

答案 3 :(得分:1)

使用单个索引,并在您使用单个数组时使用:

void f()
{
    struct
    {
        std::string month;
        std::string days;
    } calendar[] = {
        { "January",  "31" },
        { "February", "28" },
        { "March",    "31" }
    };

    for(auto i=0; i<ARRAY_SIZE(calendar); ++i)
    {
        ss << calendar[i].month << " " << caledar[i].days << " ";
    }
}