用来避免行末空格的cout<<"\n "[i < n];是什么语法?
在算法竞赛中,很多赛题都需要输出一整个数组,但是由于评测姬的机制不同,某些OJ会卡行末空格,这样的体验是很痛苦的,如果不报PE那更是要命。 在众多避免行末空格的方法中,cout << "\n "[i < n];显得十分简洁,但是它究竟是什么语法允许的?之前一直想不通,今天突然想到了下标,测试了一下果真如此,同时也找到了具体的语法依赖。 先上结论:其实就是下标 详情见下图实例: 那么,当[i < n]为真,"\n "[1]为' '; 反之为"\n "[0],即'\n'。 这样,在数组最后一个元素输出后,输出的就不是空格,而是换行。 具体过程 Water 以前在大佬们(第一次好像是在逆十字的代码里看到的)的代码中总是看见这种避免行末空格的写法,但是并不知道这是什么语法(但是好用)。 开始以为是c++11开始的lambda表达式,但是我找文档啃了半天也找不到对应实例。然后今天终于开窍了。(误,其实答案早就找到了,倒是没太仔细求证给忽视了) 在微软的文档中写的为postfix表达式,即后缀表达式。 它其实说明了一个问题,这个"\n "和一个普通的数组一样。也就是说,这个语句在编译器中就和cout << s[i];一样自然。 当然,如果你知道"abcd"的类型实际是const char *,后面下标运算符其实带来的结果就是对指针的加减,那么,这种写法已不构成理解问题。 其他发现 下标运算符 下标运算符是可交换的。 因此,只要下标运算符未重载,表达式 array[index] 和 index[array] 就是等效的。 第一种形式是最常见的编码做法,但它们都有效。 事实上,下面的代码也能得到一致的结果。 1 2 3 for (int i = 0; i < 4; i++) { cout << (i)["abcd"] << ' '; } 参考链接 Docs Microsoft C++、C 和 汇编程序 C++ 语言 C++ 语言参考 内置运算符、优先级和关联性 下标运算符: 摘录一下我们需要的依赖项:...