编译语言的四个基本准则
1.最高准则—无二义性
1.1基本理解
即一串代码只可有一种执行方式,在语义上和逻辑上不能有歧义,这同时也是所有编程语言所要遵守的最高准则。
1.2具体体现
1.2.1运算符的优先级与结合性
- 优先级是为了解决语句运算中运算符使用的先后问题。
如: int i = 3 + 4 * 5; 是(3+4)×5还是3+(4×5) .
- 结合性是为了解决当运算符优先级相同时操作数的结合性时从右向左还是从左向右的问题。
如: int j = 120 / 4 * 5; 是(120/4)×5还是120/(4×5).
一些常见运算符优先级
运算符 | 结合律 |
---|---|
() | 从左往右 |
+ - (一元) | 从右往左 |
* / | 从左往右 |
+ - (二元) | 从左往右 |
= | 从右往左 |
1.2.2 标识符命名规则
不能用关键字当作标识符(如变量名),否则,编译器将视之为语法错误。
不可以用数字作为名称开头。因为这样将无法判断像10e3是变量名还是数字常量,违反了无二义准则;且若以数字开头,则要遍历后续字符,才可判断是否为数字常量,降低了编译的速度,也违反了高效性的原则。
且尽量避免以下划线-开头,因为操作系统和库常使用以一个或两个下划线字符开始的标识符,进而导致名称冲突
1.2.3 贪心规则
每个符号应该包含尽可能多的字符,也就是说,我们的编译器将程序分解成符号的方法是从左向右一个一个字符的读入,如果该字符可以组成一个符号那么再读入下一个字符,然后在判断已经读入的两个字符是否有可能是一个符号或者一个字符的组成部分,如果可能则继续读入下一个字符,然后重复整个过程。
如:
int i = 10;
int j = 20;
int k = i+++j;
分析得,先使用i的值后给i+1,所以i = 11; j = 20; k = (i++) + j = 10 + 20 = 30; 在分析符号时,编译器会尽可能多的结合有效的符号。
1.2.4 作用域
- 作用域是指程序中可访问标识符的区域,可分为文件作用域,块作用域,函数作用域,函数原型作用域,变量只在其对应的作用域中可见。
- 使用::可以访问全局变量。
- 内作用域同名变量定义会暂时隐藏外层变量定义。
# include <iostream>
void oil(int x);
int main()
{
using namespace std;
int texas = 31;
cout << "In main(), texas = " << texas << ", &texas = ";
cout << &texas << endl;
oil(texas);
cout << "In main(), texas = "