我不理解在这种情况下
[i == n-1]
是如何起作用的。for (int i = 0; i < n; i++) {
cout << a[i] << " \n"[i == n - 1];
}
[i == n-1]
是如何起作用的。for (int i = 0; i < n; i++) {
cout << a[i] << " \n"[i == n - 1];
}
表达式i == n-1
是一个布尔表达式,将评估为1
(True)或0
(False)。
"\n"
是一个由3个字符值组成的数组:
Space
(0x32)\n
(0x0D)NULL
(0x00)因此,完整的表达式将根据i
是否为数组a
的最后一个索引来计算,将评估为Space
或\n
。
完整的for循环和cout将打印空格,直到i
在数组末尾,然后最终在最后一个元素之后打印一个\n
。
这很巧妙,但令人困惑。我会告诉程序员找到更好的方法。
我可能更喜欢使用三目运算符(? :
)
for (int i = 0; i < n; i++) {
cout << a[i] << (i == n - 1) ? "\n" : " ";
}
" \n"
的类型是const char[3]
(其中一个用于0终止器),你可以像往常一样访问该数组的元素:assert(" \n"[0] == ' ');
assert(" \n"[1] == '\n');
对于除了最后一次迭代之外的所有迭代,"index" i == n-1
都是 true
,这会转换为 1
(而 false
则变成 0
)。因此,可以更易读地编写相同的代码:
for (int i = 0; i < n; i++) {
if ( i == n-1) {
cout << a[i] << '\n';
} else {
cout << a[i] << ' ';
}
}
std::cout << i[a] << (i == n - 1)[" \n"];
。 - undefinedcout << "Hello" [i == 0]
时,它会输出'e'
呢?难道不应该输出'H'
吗? - undefined