cout << " \n"[i == n - 1]; 这段代码是怎么工作的?

3
我不理解在这种情况下[i == n-1]是如何起作用的。
for (int i = 0; i < n; i++) {
    cout << a[i] << " \n"[i == n - 1];
}

10
有人试图过度聪明。 - undefined
3
你可以通过数组完成许多巧妙(但不必要)的操作。为了超越他们混淆视听的尝试,请回复std::cout << i[a] << (i == n - 1)[" \n"]; - undefined
他们在这方面有任何明显的性能改进吗?只有他们的分析工具才知道确切情况。 - undefined
分支可能非常慢,所以它们可能一直试图避免使用,但是输入/输出速度更慢,所以没有任何区别。如果只是构建一个字符串,这可能有用,但也有更清晰的方式。 - undefined
兄弟们,为什么当我打印 cout << "Hello" [i == 0] 时,它会输出 'e' 呢?难道不应该输出 'H' 吗? - undefined
显示剩余5条评论
2个回答

4

表达式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" : " ";
  }

0
字符串字面值" \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] << ' ';
    } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接