目录
一、学习目标
二、运算符详谈
算术运算符
关系运算符
逻辑运算符
位运算符
特殊运算符
条件运算符
sizeof 运算符
打怪实战
三、控制流
二路分支
多路分支
const
while与 do…while循环
语法:
for循环
break与continue
goto语句(不建议使用)
总结
运算符 |
功能说明 |
举例 |
|
|
+a / a+b |
|
一目取负 |
-a / a-b |
|
双目运算符 用于相乘 |
|
|
双目运算符 用于相除 |
a/ b 5/3 = 1 5.0/3 = 1.5 |
|
双目运算符 用于求余计算 |
a%b 5%3 = 2 |
|
单目运算符 用于对某一个值进行+1运算 |
++a (先运算然后返回的是a的地址) a++ (先返回的是a的值[常量],然后再运算) |
|
单目运算符 用于对某一个值进行-1运算 |
--a (先运算然后返回的是a的地址) a-- (先返回的是a的值[常量],然后再运算) |
int a = 100; int b = 200; int c = ++a;
// a先自加1,变成101;然后再赋值给c,因此c等于101
int d = b++;
// b先赋值给d,因此d等于200;然后b自加1,变成201
运算符 |
功能 |
举例 |
说明 |
> |
用于判断关系是否大于 |
a > b |
|
用于判断关系是否小于 |
a < b |
||
>= |
用于判断关系是否大于或等于 |
a >= b |
|
用于判断关系是否小于或等于 |
a |
||
== |
用于判断两个关系是否等于 |
a+43 == 98-b |
|
!= |
用于判断两个关系是否不等于 |
a!=b |
运算符 |
功能说明 |
举例 |
! |
逻辑反 |
!(x==0) |
&& |
逻辑与 |
x>0 && x |
|| |
逻辑或 |
y100 |
运算符 |
名称 |
举例 |
功能说明 |
~ |
位逻辑反 |
~a |
将变量 a 中的每一位取反 |
& |
位逻辑与 |
a & b |
将变量 a 和 b 逐位进行与操作 |
| |
位逻辑或 |
a | b |
将变量 a 和 b 逐位进行或操作 |
^ |
位逻辑异或 |
a ^ b |
将变量 a 和 b 逐位进行异或操作 |
左移 |
a |
将变量 a 中的每一位向左移动4位 |
|
>> |
右移 |
x >> n |
将变量 x 中的每一位向右移动4位 |
int a, b;
int x[5];
a = 100; // 对变量 a 赋值,正确
3 = 100; // 对常量 3 赋值,错误!
x = 123; // 对数组 b 赋值,错误!
// 连续赋值
a = b = 50; // 先将 50 赋给 b,再将 b 的值赋给 a,正确
// 加减乘除:
a += n; // 等价于 a = a+n; a = n + a [不太型]
a -= n; // 等价于 a = a-n; a = n - a [完全不行]
a *= n; // 等价于 a = a*n; 【不太行】
a /= n; // 等价于 a = a/n; 【完全不行】
// 求余:
a %= n; // 等价于 a = a%n;
// 位运算:
a &= n; // 等价于 a = a&n;
a |= n; // 等价于 a = a|n;
a ^= n; // 等价于 a = a^n;
a >>= n; // 等价于 a = a>>n;
a <<= n; // 等价于 a = a<
int a = 100;
int b = 200;
int m = (a>b) ? a : b; // 如果 a>b 为真,则 m 取 a 的值,否则取 b 的值
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long double));
int a[5];
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
return运算符
float func()
{
return 1.34;
}
优先级与结合性
提示:华氏温度F转化为摄氏温度C的公式为: C = 5×(F - 32)÷ 9
输入:18输出:2星期零4天
#include
int main(void)
{
int x = 10;
int a, b, c;
a = x++;
b = ++x;
c = 10*x++;
printf(“x=%d,a=%d,b=%d,c=%d\n”, x, a, b, c);
return 0;
}
语法:
if ( 布尔表达式 )
{
// 如果布尔表达式为真则执行{} 中的代码
}
if( 布尔表达式 )
{
// 如果布尔表达式为真 则执行 代码块 A
}
else
{
// 否则执行 代码块 B
}
// if 语句 int a = 124 ;
if(a%2 == 0)
{
printf("a是偶数\n");
}
//if-else 语句
if(a%2 == 0)
{
printf("a是偶数\n");
}
else
{
printf("a是奇数\n");
}
注意:
使用if-else来实现多路分支:
if (ch >= 65 && ch <= 90)
{
printf("这是一个大写字母...\n");
}
else if( ch >= 'a' && ch <= 'z' ) {
printf("这是一个小写字母...\n");
}
else if (ch >= '0' && ch <= '9')
{
printf("这是一个数字...\n");
}
else{
printf("这是一个其他的符号...\n");
}
switch ( 必须是一个整形表达式 )
{
case 整形常量1 :
代码片段1
break ; // 跳出语句 【不是必须的】
case 整形常量2 :
代码片段2
break ; // 跳出语句 【不是必须的】
case 整形常量3 :
代码片段3
break ; // 跳出语句 【不是必须的】
....
.....
.....
case 整形常量n ... 整形常量n+X: // 表示一个取值范围 在 n 与 n+X 之间
代码片段N-1
break ; // 跳出语句 【不是必须的】
case 整形常量N :
代码片段N
break ; // 跳出语句 【不是必须的】
default: // 如果以上所有的CASE都不符合则进入defalue 语句中
代码片段N+1
break;
}
switch(n)
{
case 1:
printf("one\n");
break;
case 2:
printf("two\n");
break;
case 3:
printf("three\n");
break;
default:
printf("其他数字\n");
}
- switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型
- case 语句只能带整型常量,包括普通整型或字符,不包括 const 型数据。
- break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过下一个case语句的判断执行执行代码段
- default 语句不是必须的,一般放在最后面(因此不需要 break)
- 如果想判断一定的范围可以 使用...作为一个范围的选择 比如 1 ... 30 表示1到30之间
多路分支小怪练习:
int const a = 100; // 定义了一个不可修改的变量a
const int b = 200; // 定义了一个不可修改的变量b
const int c ; // 语法上没有问题,但是c的值完全没有任何作用
a = 101; // 错误
b = 202; // 错误
while循环
while( 布尔表达式 ) // 只要该表达式为真则代码块会被一直执行
{
代码块
}
while循环:
入口判断
// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
while(a <= 100)
{
printf("%d\n", a);
a++;
}
do-while 循环
do-while循环:出口判断
// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
do
{
printf("%d\n", a);
a++;
}while(a <= 100);
语法:
for ( 初始化语句 ; 条件判断语句 ; 循环变量迭代语句 )
{
代码块
}
注意:
# 初始化语句 只会在进入for循环的时执行一次
# 条件判断语句 每一次进入for 循环时都会执行判断
# 循环变量迭代语句 在每一次循环结束后执行
流程:
初始化 --> 判断是否满足 --> 执行代码块 --> 执行循环变量的迭代
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
printf("%d\n", a);
}
语法点:
for (;;) // 死循环
{
}
switch(n)
{
case 1:
printf("one\n");
break; // 跳出 switch 语句
case 2:
printf("two\n");
break;
}
while(1)
{
int n = scanf("%d", &a);
if(n == 0)
break; // 跳出当层 while 循环体
}
for(int i=1; i<=100; i++)
{
if(i%7 == 0)
continue; // 跳过所有能被7整除的数
printf("%d\n", i);
}
语法:
标签:
goto 标签;
int main()
{
printf("%d\n", __LINE__); // 打印第3行
// 无条件跳转到label处
goto label;
printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:
printf("%d\n", __LINE__); // 打印第9行
}
Init()
{
// 初始化LCD 设备
if(error)
{
goto exit_lcd ;
}
// 初始化 触摸屏设备
if(error)
{
goto exit_touch ;
}
// 初始化蓝牙设备
if(error)
{
goto exit_Bt ;
}
// 初始化网络设备
if(error)
{
goto exit_Net ;
}
exit_Net:
// 释放网络设别
exit_Bt:
// 释放蓝牙设别
exit_touch:
// 释放触摸屏资源
exit_lcd:
// 释放LCD的资源
}
本文细讲了打怪路上的运算符怪和控制流怪的特点和消灭方法,各位只需认真学习,即可消灭它们。祝各位都可爬上C语巅峰,斩尽拦路小妖。
本文参考 粤嵌文哥 的部分课件,经过整理和修改后发布在C站。如有转载,请联系本人