C++ cout<<&引用\";[i==n-1];工作

C++ cout<<&引用\";[i==n-1];工作,c++,C++,我不知道[I==n-1]在这种情况下是如何工作的 for (int i = 0; i < n; i++) { cout << a[i] << " \n"[i == n - 1]; } for(int i=0;i

我不知道
[I==n-1]
在这种情况下是如何工作的

for (int i = 0; i < n; i++) {
    cout << a[i] << " \n"[i == n - 1];
}
for(int i=0;i“\n”
的类型为
const char[3]
(一个用于0终止符),您可以像往常一样访问该数组的元素:

assert(" \n"[0] == ' ');
assert(" \n"[1] == '\n');
对于除最后一次迭代外的所有迭代,“索引”
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] << ' ';
    } 
}
for(int i=0;icout表达式
i==n-1
是一个布尔表达式,其计算结果为
1
(真)或
0
(假)

“\n”
是由3个字符值组成的数组:

  • 空格
    (0x32)
  • \n
    (0x0D)
  • NULL
    (0x00)
因此,根据
i
是否是数组
a
的最后一个索引,完整表达式将计算到
空间
\n

带有cout的complete for循环将打印空格,直到
i
位于数组末尾,然后最终将在最后一个元素之后打印
\n

这很聪明,但令人困惑。我会告诉程序员找到更好的方法

我可能更喜欢使用三元运算符(
?:

for(int i=0;i难道有人想变得超级聪明吗?:
false
为零,
true
为一。你可以做很多棘手的事情(而且是不必要的)与数组有关的事情。为了使他们的混淆尝试更成功,请用
std::回复。他们是否从中获得了任何明显的性能改进?只有他们的探查器可以确定。分支可能非常慢,因此他们可能一直在试图避免它们,但I/O速度要慢得多,因此没有任何区别。如果只构建一个str,可能会很有用但也有更清晰的方法。
for (int i = 0; i < n; i++) {
        cout << a[i] << (i == n - 1) ? "\n" : " ";
  }