目录
一、运算符
1.算术运算符
算术运算符是对数值类型的变量进行运算的,在C程序中使用的非常多。
下表显示了 C 语言支持的所有算术运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 符号描述 | 操作数个数 | 作用描述描述 | 实例 | 副作用 |
+ | 正号 | 1 | 把两个操作数相加 | A + B 将得到 30 | 无 |
- | 负号 | 1 | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 | 无 |
+ | 加号 | 2 | 把两个操作数相加 | A + B 将得到 30 | 无 |
- | 减号 | 2 | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 | 无 |
* | 乘号 | 2 | 把两个操作数相乘 | A * B 将得到 200 | 无 |
/ | 除号 | 2 | 分子除以分母 | B / A 将得到 2 | 无 |
% | 取余(取模) | 2 | 取模运算符,整除后的余数 | B % A 将得到 0 | 无 |
++ | 自增 | 1 | 自增运算符,整数值增加 1 | A++ 将得到 11 | 有 |
-- | 自减 | 1 | 自减运算符,整数值减少 1 | A-- 将得到 9 | 有 |
自增和自减
-
前置++/--:先自增或自减,再参与运算。
-
后置++/--:先参与运算,后自增或自减。
2.关系运算符(比较运算符)
下表显示了 C 语言支持的所有关系运算符。假设变量A的值为 10,变量 B 的值为 20,则:
运算符 | 符号描述 | 操作个数 | 作用描述 | 实例 | 副作用 |
== | 相等 | 2 | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假 | 无 |
!= | 不等 | 2 | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真 | 无 |
> | 大于 | 2 | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假 | 无 |
< | 小于 | 2 | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真 | 无 |
>= | 大于等于 | 2 | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假 | 无 |
<= | 小于等于 | 2 | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真 | 无 |
3.逻辑运算符
下表显示了C语言支持的所有关系逻辑运算符.假设变量A的值为1,变量B的值为 0,则:
运算符 | 符号描述 | 操作数个数 | 描述 | 实例 | 副作用 |
&& | 逻辑与 | 2 | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假 | 无 |
|| | 逻辑或 | 2 | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真 | 无 |
! | 逻辑非 | 1 | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真 | 无 |
4.赋值运算符
下表列出了 C 语言支持的赋值运算符:
运算符 | 符号描述 | 操作数个数 | 描述 | 实例 | 副作用 |
= | 赋值 | 2 | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C=A+B 将 A+B 的值赋给 C | 有 |
+= | 相加赋值 | 2 | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A | 有 |
-= | 相减赋值 | 2 | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A | 有 |
*= | 相乘赋值 | 2 | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A | 有 |
/= | 相除赋值 | 2 | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A | 有 |
%= | 取余赋值 | 2 | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A | 有 |
<<= | 左移赋值 | 2 | 左移且赋值运算符 | C <<= 2 等同于C=C << 2 | 有 |
>>= | 右移赋值 | 2 | 右移且赋值运算符 | C >>= 2等同于C=C >> 2 | 有 |
&= | 按位与赋值 | 2 | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 | 有 |
^= | 按位异或赋值 | 2 | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 | 有 |
|= | 按位或赋值 | 2 | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 | 有 |
注意:
- 赋值运算符的第一个操作数(左值)必须是变量的形式,第二个操作数可以是任何形式的表达式。
- 赋值运算符的副作用针对第一个操作数。
5.位运算符
下表显示了 C 语言支持的位运算符。假设变量 A 的值为 5,变量 B 的值为 3,则:
运算符 | 符号描述 | 操作数个数 | 实例 | 副作用 |
& | 按位与 | 2 | (A & B) 将得到 1,即为 0000 0001 | 无 |
| | 按位或 | 2 | (A | B) 将得到 7,即为0000 0111 | 无 |
^ | 按位异或 | 2 | (A ^ B) 将得到 6,即为 0000 0110 | 无 |
~ | 按位取反 | 1 | (~A ) 将得到 -6,即为 1000 0110,一个有符号二进制数的补码形式。 | 无 |
<< | 按位左移 | 2 | A << 2 将得到 20,即为 0001 0100 | 无 |
>> | 按位右移 | 2 | A >> 2 将得到 1,即为0000 0001 | 无 |
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
a | b | a & b | a | b | a ^ b |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
注意:操作数进行位运算的时候,以它的补码形式进行运算。
6.杂项运算符
下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :
运算符 | 描述 | 实例 | |
sizeof() | sizeof运算符(sizeof函数) | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
& | 取地址符号 | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
* | 间接运算符(解引用符) | 指向一个变量。 | *a; 将指向一个变量。 |
? : | 三元运算符 | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
sizeof() 用来获取类型或者变量及字面量的字节大小.
二、分支控制语句
1.单项分支
流程图
基本语法:
if (条件表达式)
{
执行代码块;
}
代码展示:
#include <stdio.h>
int main()
{
// 单向分支
// 案例:提示用户输入年龄,如果未成年则提示,不可以看电影
int age; // 声明一个变量,用来存储用户输入的年龄数据
printf("请您输入一个年龄,按回车结束输入\n"); // 提示输入
scanf("%d", &age); // 读取标准流中输入的年龄数据,并存储到age变量中
// 通过if语句判断
if (age <= 18)
{
printf("不能看电影 \n");
}
printf("程序结束 \n");
return 0;
}
2.双向分支
流程图
基本语法:
if (条件表达式)
{
执行代码块1;
}
else
{
执行代码块2;
}
代码展示:
#include <stdio.h>
int main()
{
// 输入年龄,如果大于18岁,则输出 “你年龄大于18,要对自己的行为负责!”,否则,输出”你的年龄不大这次放过你了。
int age; // 声明变量,没有赋值,用来存储用户输入的年龄
printf("请您输入年龄,按回车结束");
scanf("%d", &age); // 从标准输入流中读取输入的数据,并存储到age变量中
// 判断
if (age < 18)
{
printf("回家写作业吧,孩子");
}
else
{
printf("成年了,要负责哦");
}
return 0;
}
3.多项分支
else if
流程图
基本语法
if (条件表达式1)
{
执行代码块1;
}
else if (条件表达式2)
{
执行代码块2;
}
...
else
{
执行代码块n;
}
代码展示:
#include <stdio.h>
int main()
{
// 声明int类型的变量
int score;
printf("请输入成绩 \n");
scanf("%d", &score);
// 判断成绩的分数范围
if (score >= 90)
{
printf("奖励一个华为手机");
}
else if (score>=80)
{
printf("奖励一个平板");
}
else if(score>=60){
printf("奖励一个肉夹馍");
}else{
printf("没有奖励");
}
return 0;
}
switch
流程图
基本语法
switch (表达式)
{
case 常量值1:
语句块1;
break;
case 常量值2:
语句块2;
break;
case 常量值n:
语句块n;
break;
default:
语句块n + 1;
}
注意
- switch后面表达式的值必须是一个整型(char、short, int, long等)或枚举类型。
- case后面的值必须是常量,而不能是变量。
- default是可选的,当没有匹配的case时,执行default。
- break语句可以使程序跳出switch语句块,如果没有break,会执行下一个case 语句块,直到遇到break或者执行到switch结尾,这个现象称为穿透。
代码展示:
#include <stdio.h>
int main()
{
// 请输入a-d之间任意一个字母
char ch; // 声明char类型的变量
printf("请您输入a-d之间任意一个字母 \n");
scanf("%c", &ch);
switch (ch)
{
case 'a':
printf("星期一开飞机");
break;
case 'b':
printf("星期二去吃饭");
break;
case 'c':
printf("星期三去搬砖");
break;
case 'd':
printf("星期四去练字");
break;
default:
printf("输入有误");
break;
}
return 0;
}
#include <stdio.h>
int main()
{
int month;
printf("请输入月份1-12月\n");
scanf("%d", &month);
// 判断
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf(" %d 月有31天 \n", month);
break;
case 4:
case 6:
case 9:
case 11:
printf(" %d 月有30天 \n", month);
break;
case 2:
printf(" %d 月有28天或29天", month);
break;
default:
printf("输入有误");
}
return 0;
}
4.嵌套分支
基本语法:
if ()
{
if ()
{
}
else
{
switch ()
{
case …
}
}
}
代码展示:
#include <stdio.h>
int main()
{
// 声明两个变量用来存储油号和油量
int oilN, oilL;
// 提示用户输入油号
printf("请输入油号 \n");
scanf("%d", &oilN);
// 提示用户输入油量
printf("请输入油量 \n");
scanf("%d", &oilL);
// 声明变量,存储油的价格
double price;
// 判断油号
switch (oilN)
{
case 92:
price = 4;
if (oilL >= 40)
{
price = 3.5;
}
printf("您本次加油需要%.2f元", price * oilL);
break;
case 95:
price = 5;
if (oilL >= 40)
{
price = 4.5;
}
printf("您本次加油需要%.2f元", price * oilL);
break;
}
return 0;
}