OIer 对 C++ 一定不陌生了。
而如果接下来我提到的 C++ 语法你都会,那你不用搞 OI 了。

数组取值

取数组 a 的第 i 项,众所周知是 a[i]

指针大佬肯定会跳起来说:还可以是 *(a+i)
既然如此,应该能理解加法是有交换律的。
那么就还可以写成 *(i+a)

然而我想很少有人会知道可以反过来:i[a]

括号返回值

一般一系列语句可以用逗号隔开,但是用小括号括起来呢?

比如说 int a=(1,2,3) a 的值会是多少?
试一下不就知道了。
会是 3,小括号会将最后一条语句的值作为返回值。

如果你说你对逗号不熟,那用分号隔开语句你一定知道吧。
用大括号把语句括起来呢?
比如说 int a=({int b=1;b++;b+10;}) 后 a 的值是多少?
还是会返回最后一句,也就是 12 。

前导零

如果用一个有前导零的数字会怎么样?

运行 std::cout<<010 你得到的绝不会是一个 10,而是 8。
这是因为 c/c++ 中以 0 开头的数会被认为是 8 进制。

Trigraphs

在 g++ 编译时加上参数 -trigraphs,再试试这样一句输出: std::cout << "test: ??!" << std::endl;

和你想象中的不一样?
去掉 -trigraphs 参数再试试,会给出一条 warning :
cpp.cpp:5:20: warning: trigraph ??! ignored, use -trigraphs to enable [- Wtrigraphs]
这条 warning 说明了原因。

另外给出一张 trigraph 表:

替换前 替换后
??= #
??( [
??/ \
??) ]
??’ ^
?? }
??- ~

最后的玄学代码

你尽管编译运行(加 -trigraphs 参数),过不了编译算我输:

#include <bits/stdc++.h>

int main() {
    int a ??( ??) = {(3,2,1),2,3};
    std::cout << 1[a] << ' ' << 0[a][a] << std::endl;
    int k = ({
        a[0] = 1;
        a[1] = a[0] + 1;
        a[2] = a[1] ??' a[0];
        a[0] + a[1] + a[2];
    });
    std::cout << k << std::endl;
}
分类: C++

4 条评论

Dobe · 2019年3月6日 下午8:57

Orz

hard_to_name · 2019年3月6日 下午10:47

Orz

Kewth · 2019年3月9日 下午7:21

Orz

Allenyou1126 · 2019年5月18日 下午9:06

Orz

发表评论

电子邮件地址不会被公开。 必填项已用*标注