一些基本概念:
符号:程序的一个基本组成单元,作用相当于句子中的单词,是程序的基本信息单元 。
字符序列:由符号组成,在不同的语境中可能会有不同的含义。词法分析器:编译器中将程序分解为符号的部分。
1.
if(x > big) big = x;
/*1*/
//这里的符号依次是关键字"if"、"("、"x"、">"、"big",")"依次类推,
//符号间的空白(空格、制表符、换行)会被忽略。例子如下:
if
(
x
>
big
)
big
=
x
;
词法分析采用贪心法(每个符号包含尽可能多的字符)
编译器将程序分解为符号的过程:从左到右,一个一个字符地读,如果该字符可能组成一个符号,则继续读入下一个字符,判断已读入的两字符是否可能组成一个符号,如果可以的话,按照以上规则,继续往下读,不可以的话就终止;
除了字符串与字符常量, 符号之间不可以有空白(空格、制表符、回车),实例如下:
int a = 1, b = 2;
cout << a---b << endl;//-1
a = 1, b = 2;
cout << a-- -b << endl;//-1
a = 1, b = 2;
cout << a- --b << endl;//0
3.
int x = 0, y = 0, *p = &x;
y = x/*p; /*p指向除数*/ /*这里的"/*"被译为注释的开始*/
//正确写法:
y = x / *p; /**p指向除数*/
y = x / (*p);
/*这种问题叫做准二义性问题*/
4.
int a = 0; a =+ 1;//这里a = 1,相当于 a += 1;
5.
单引号引起的字符实际上代表的是一个整数,整数值对应于该字符在编译器中采用的字符集的序列值;
双引号引起的字符串,代表的是指向无名数组起始字符的指针 ,该数组被双引号间的字符串以及'\0'初始化
例子如下:
printf("Hello World!\n");
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '\n', '\0'};
printf(hello);
//双引号引起的字符代表指针,单引号引起的字符代表的是一个整数
char *s = 'a'; //编译错误,因为'a'不是指针