1. 评估(Evaluation)
在C语言中,评估是指计算给定表达式的值。表达式可以由常量、变量、操作符和函数调用组成。C语言中的操作符包括算术、关系、逻辑、位、赋值和其他操作符。在评估表达式时,C编译器根据操作符的优先级和关联规则来确定表达式的值。
例如,假设有一个算术表达式2 + 3 * 4,根据算术运算符的优先级,乘法运算符应该先于加法运算符进行计算。因此,编译器首先计算3 * 4,得到12,然后再将2加上12,得到14。因此,这个表达式的值为14。
除了操作符优先级外,括号也可以用来改变表达式的计算顺序。例如,表达式(2 + 3) * 4会先计算括号内的表达式,得到5,然后再将5乘以4,得到20。
以下是一个使用不同操作符和括号的表达式示例:
int a = 2;
int b = 3;
int c = 4;
int result = a + b * c; // result的值为14
result = (a + b) * c; // result的值为20
result = a * (b - c / 2); // result的值为-2
2. 优先级(Precedence)
在C语言中,操作符的优先级是指表达式中哪些操作符应该先被计算。例如,乘法和除法的优先级要高于加法和减法。如果表达式中有多个操作符,编译器将按照优先级的顺序计算表达式的值。
2.1 操作符优先级
以下是C语言中操作符的优先级,由高到低:
优先级 | 操作符 | 说明 |
---|---|---|
1 | () [] -> | 函数调用、数组下标、结构体成员访问 |
2 | ! ~ ++ -- + - * & sizeof (type) | 逻辑非、位取反、自增自减、正负、取地址、求大小 |
3 | * / % | 乘、除、取模 |
4 | + - | 加、减 |
5 | << >> | 左移、右移 |
6 | < <= > >= | 小于、小于等于、大于、大于等于 |
7 | == != | 等于、不等于 |
8 | & | 位与 |
9 | ^ | 位异或 |
10 | | | 位或 |
11 | && | 逻辑与 |
12 | || | 逻辑或 |
13 | ?: | 条件运算符 |
14 | = += -= *= /= %= <<= >>= &= ^= |= | 赋值、复合运算赋值 |
15 | , | 逗号 |
2.2 操作符优先级示例
以下是一些使用不同操作符和括号的表达式示例:
int a = 2;
int b = 3;
int c = 4;
int result = a + b * c; // result的值为14
result = (a + b) * c; // result的值为20
result = a * (b - c / 2); // result的值为-2
result = a & b | c; // result的值为6
result = a & (b | c); // result的值为2
result = a != b || c != 0; // result的值为1(true)
result = (a != b) || (c != 0); // result的值为1(true)
3. 关联(Association)
操作符的关联是指当相同优先级的操作符在表达式中出现时,编译器的计算顺序是从左到右还是从右到左。例如,赋值操作符的关联是从右到左。这意味着当连续出现多个赋值操作符时,编译器将从右到左计算赋值表达式的值。
以下是C语言中操作符的关联:
左关联(左结合):从左到右计算
赋值操作符(=、+=、-=等)
逗号操作符(,)
右关联(右结合):从右到左计算
指针操作符(*、&)
自增自减操作符(++、--)
3.1 关联示例
以下是一些使用不同关联规则的表达式示例:
int a = 2;
int b = 3;
int c = 4;
a = b = c; // a、b和c的值都为4
a = (b = c) + 1; // b的值为4,a的值为5
int *p;
int d = 5;
p = &d; // p指向d的地址
int e = 6;
*p = e; // d的值变为6
e = 7;
*p++; // p指向下一个地址,但不会修改d的值
*p = e; // 修改p指向的地址的值为7,也就是d的新值为6