1. 三目运算符
三目运算符是C语言中唯一的三元运算符,形式为 表达式1 ? 表达式2 : 表达式3。
1.1 语法规则
求值规则:
如果
表达式1为真,三目运算符的运算结果为表达式2的值。如果
表达式1为假,三目运算符的运算结果为表达式3的值。
示例:
int a = 10;
int b = 20;
int max = (a > b) ? a : b; // 如果 a > b,max = a;否则 max = b
printf("max = %d\n", max); // 输出:20
1.2 注意事项
?和:是一个整体,不能分开使用。三目运算符可以嵌套使用,但应避免过度嵌套,以免降低代码可读性。
2. 运算符优先级
运算符优先级决定了表达式中运算符的执行顺序。以下是C语言中常见运算符的优先级(从高到低):
| 优先级 | 运算符名称或含义 | 使用形式 | 结合方向 | 说明 |
|---|---|---|---|---|
| 1 | [] 数组下标 | 数组名[常量表达式] | 左到右 | |
() 圆括号 | (表达式) 或 函数名(形参表) | 左到右 | ||
. 成员选择(对象) | 对象.成员名 | 左到右 | ||
-> 成员选择(指针) | 对象指针->成员名 | 左到右 | ||
| 2 | - 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ 按位取反 | ~表达式 | 右到左 | 单目运算符 | |
++ 自增 | ++变量名 或 变量名++ | 右到左 | 单目运算符 | |
-- 自减 | --变量名 或 变量名-- | 右到左 | 单目运算符 | |
* 取值 | *指针变量 | 右到左 | 单目运算符 | |
& 取地址 | &变量名 | 右到左 | 单目运算符 | |
! 逻辑非 | !表达式 | 右到左 | 单目运算符 | |
(类型) 强制类型转换 | (数据类型)表达式 | 右到左 | ||
sizeof 长度运算符 | sizeof(表达式) | 右到左 | ||
| 3 | / 除 | 表达式 / 表达式 | 左到右 | 双目运算符 |
* 乘 | 表达式 * 表达式 | 左到右 | 双目运算符 | |
% 取模 | 整型表达式 % 整型表达式 | 左到右 | 双目运算符 | |
| 4 | + 加 | 表达式 + 表达式 | 左到右 | 双目运算符 |
- 减 | 表达式 - 表达式 | 左到右 | 双目运算符 | |
| 5 | << 左移 | 变量 << 表达式 | 左到右 | 双目运算符 |
>> 右移 | 变量 >> 表达式 | 左到右 | 双目运算符 | |
| 6 | > 大于 | 表达式 > 表达式 | 左到右 | 双目运算符 |
>= 大于等于 | 表达式 >= 表达式 | 左到右 | 双目运算符 | |
< 小于 | 表达式 < 表达式 | 左到右 | 双目运算符 | |
<= 小于等于 | 表达式 <= 表达式 | 左到右 | 双目运算符 | |
| 7 | == 等于 | 表达式 == 表达式 | 左到右 | 双目运算符 |
!= 不等于 | 表达式 != 表达式 | 左到右 | 双目运算符 | |
| 8 | & 按位与 | 表达式 & 表达式 | 左到右 | 双目运算符 |
| 9 | ^ 按位异或 | 表达式 ^ 表达式 | 左到右 | 双目运算符 |
| 10 | | 按位或 | 表达式 | 表达式 | 左到右 | 双目运算符 |
| 11 | && 逻辑与 | 表达式 && 表达式 | 左到右 | 双目运算符 |
| 12 | | 逻辑或 | 表达式 | 表达式 | 左到右 | 双目运算符 |
| 13 | ?: 三目运算符 | 表达式1 ? 表达式2 : 表达式3 | 右到左 | 三元运算符 |
| 14 | = 赋值 | 变量 = 表达式 | 右到左 | |
| 15 | , 逗号运算符 | 表达式, 表达式, ... | 左到右 |
3. 类型转换
类型转换分为 隐式转换 和 强制转换。
3.1 隐式转换
规则:
系统会自动将占用内存较少的类型提升为占用内存较高的类型,再进行运算。
例如,
int和double运算时,int会被隐式转换为double。
示例:
double a = 1.0 / 2; // 1.0 是 double,2 被隐式转换为 double
printf("a = %lg\n", a); // 输出:0.5
double b = 1 / 2; // 1 和 2 都是 int,结果为 0,再隐式转换为 double
printf("b = %lg\n", b); // 输出:0
3.2 强制转换
规则:
- 使用强制类型转换运算符
(类型),将一个变量或表达式转换为指定类型。
- 使用强制类型转换运算符
示例:
int a = 0;
double b = 2.3;
a = (int)b; // 将 b 强制转换为 int
printf("a = %d\n", a); // 输出:2
printf("b = %lg\n", b); // 输出:2.3
4. 流程结构
流程结构包括 顺序结构、分支结构 和 循环结构。
4.1 顺序结构
代码按照从上到下的顺序依次执行。
示例:
int a = 10;
int b = 20;
int sum = a + b;
printf("sum = %d\n", sum); // 输出:30
4.2 分支结构
包括
if、else if、else和switch语句。示例:
int score = 85;
if (score >= 90) {
printf("优秀\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
4.3 循环结构
包括
for、while和do-while语句。示例:
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}
总结
三目运算符:
表达式1 ? 表达式2 : 表达式3,用于简化条件判断。运算符优先级:决定了表达式中运算符的执行顺序。
类型转换:
隐式转换:系统自动进行类型提升。
强制转换:使用
(类型)手动转换。
流程结构:包括顺序、分支和循环结构,是程序的基本执行方式。
