我已经完成了一项任务,但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循环,但我根本无法工作。
答案 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 << " ";
}
}