三字符组 ( 三字符序列 )——
转自http://www.cppblog.com/cc/archive/2006/07/30/10709.html
首先我们来看两段简单的程序,如果你不进行编译运行 , 猜一猜结果分别是多少?
程序一
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4
5 int main()
6 {
7 int x=1;
8 // 结果是多少 ?递增?????/
9 ++x;
10 cout<<x<<endl;
11 return 0;
12 }
13
2 #include <iomanip>
3 using namespace std;
4
5 int main()
6 {
7 int x=1;
8 // 结果是多少 ?递增?????/
9 ++x;
10 cout<<x<<endl;
11 return 0;
12 }
13
程序二
1 #include <iostream>
2 #include <iomanip>
3 using namespace std;
4
5 int main()
6 {
7 int x=1;
8 // 结果是多少 ?递增?????/
9
10 ++x;
11 cout<<x<<endl;
12 return 0;
13 }
14
2 #include <iomanip>
3 using namespace std;
4
5 int main()
6 {
7 int x=1;
8 // 结果是多少 ?递增?????/
9
10 ++x;
11 cout<<x<<endl;
12 return 0;
13 }
14
你猜出运行结果了么?现在我们就来揭示谜底,第一个程序的结果是1,第二个程序的运行结果是2。
哈哈,你或许会不解吧,这里就是我们需要讲的“三字符组”,也叫着“三字符序列”。
三字符序列不太常见,但C++标准允许把某些字符指定为三字符序列。三字符序列就是用于表示另一个字符的三个字符序列。以前为了表示键盘上没有的字符,这是必不可少的一种方法。
具体的三字符序列转义的对应关系如下表:
字符串 |
转义后的含义 |
??= |
# |
??( |
[ |
??) |
] |
??/ |
\ |
??< |
{ |
??> |
} |
??' |
^ |
??! |
| |
??- |
~ |
我们现在已经基本知道什么是三字符组了,那么我们在来分析一下前面遇到的程序。
程序1中,在第8行,那是一行注释,//让后面的部分编程注释,但是问题就在这里了,??/,这其实就是一个三字符组了,前面两个??就意味着这里后面就会发生转义。这个程序中,“??/”就会被转义成“\”, 而把这个符号放在一行的末尾就相当于将接下来的一行粘贴到这一行的末尾,所以本程序中的“++x”也就成了注释的一部分,那么我们的结果是1就不足为奇了,而第二个程序的三字符组后面跟的是一行空白,所以不影响到下面的一行代码,“++x”照常执行,所以结果就是2。
此文完。
参考自《Exceptional C++ style中文版/Herb Sutter著》