C/C++中".."[expression]的解释与妙用

写这篇博客的原因是因为三个月前看到别人的代码中有这么一段:

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++的语法好像没有规定可以这样,而出现[]这一队中括号,一般都和 l a m b d a 表达式相关,我就以为这种东西可能是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题的时候可以用,很简洁,毕竟这段代码我是看了叉姐这么写的。


有时候很多东西看着没见过,其实都是我们用烂了的,只不过平时你不会那么搞而已。

猜你喜欢

转载自blog.csdn.net/FlushHip/article/details/81239552