写这篇博客的原因是因为三个月前看到别人的代码中有这么一段:
for (int i = 0; i < 100; ++i)
printf("%d%c", i, " \n"[i == 100 - 1]);
这段代码的作用就是下面代码的作用:
for (int i = 0; i < 100; ++i)
printf("%d%c", i, i == 100 - 1 ? '\n' : ' ');
" \n"[i == 100 - 1]
可以被i == 100 - 1 ? '\n' : ' '
三目运算符替代。以上两段代码的功能就是实现数据以空格间隔输出,最后换行
当时百思不得其解".."[expression]
,C/C++的语法好像没有规定可以这样,而出现[]
这一队中括号,一般都和
表达式相关,我就以为这种东西可能是C++11、或者C++14乃至C++17的新特性,然后去查了很久都没查到。。。
就在刚才,我问了下我师父,他的一句话点醒了我,“这可能是C语言的语法”,我就想到了平时最常用的数组取特定下标的操作array[index]
," \n"
是一串常量字符串,常量字符串可以表现为字符指针(printf("%s", "hello");
,这里"hello"
就表现为字符指针),那么我们把这个字符指针用变量保存起来,即char *pstr = " \n"
,那么" \n"[i == 100 - 1]
就相当于pstr[i == 100 - 1]
,这个东西是不是就熟悉多了,这不就是指针的解引用嘛(和数组取特定下标的操作类似),那么,当i == 100 - 1
成立时,这个布尔表达式的值为1,因此取出pstr[1] = '\n'
,同理可以取出pstr[0] = ' '
。这样子利用布尔表达式的01返回值加字符指针解引用就完成了三目表达式输出不同字符的功能。
不过还是要声明,数组不是指针啊,只是可以表现成指针,字符串是字符数组,可以表现为字符指针。
搞了这么久,才发现这个东西并不是什么C++的新特性,就是我们写的最平凡的C/C++代码,只不过,大家平时都不是这么用的,如果我要控制输出"YN"
中的第一个元素还是第二个元素,我会写如下代码:
const char STR[] = "YN";
// const char *STR = "YN";
void print(int index)
{
putchar(STR[index]);
}
我们总是会用一个数组或指针去存字符串"YN"
,然后再通过这种数组或指针间接访问其中的元素,这其实是我们的思维惯性,我们没有从心底认同".."
就是个数组。
所以上面的代码可以这么写:
#define STR "YN"
void print(int index)
{
putchar(STR[index]);
}
for (int i = 0; i < 100; ++i)
printf("%d%c", i, " \n"[i == 100 - 1]);
这中空格加换行的方法在OJ上A题的时候可以用,很简洁,毕竟这段代码我是看了叉姐这么写的。
有时候很多东西看着没见过,其实都是我们用烂了的,只不过平时你不会那么搞而已。