目录
关系运算符与逻辑运算符
关系运算符
逻辑运算符
&& | 与:当2个操作数都为真结果为真 |
---|---|
|| | 或:两个操作数至少一个为真结果为真 |
! | 非:操作数为真结果为假 |
短路特性
- 表达式的值可先有计算的左操作数的值推导出来,就不会计算右操作数的值
- 可以使除0运算不发生
优先级
- 逻辑非 > 算数运算符 > 关系运算符 > 逻辑与 > 逻辑或
- 也可以通过添加小括号提高优先级
条件语句
单分支选择结构(if语句)
- 结构
if(表达式P)
语句A;
双分支结构(if-else)
if(表达式P)
{
语句A;
}
else
{
语句B;
}
- 用花括号内可以表达多个语句
多分支结构(else-if)
if(表达式1)
{
语句A;
}
else if(表达式2)
{
语句B;
}
else
{
语句C;
}
条件表达式
- 表达式1?表达式2:表达式3;
- 含义:表达式1为真时,输出表达式2的值,否则输出表达式3的值
开关语句
switch语句
switch(表达式)//表达式是int型或char型
{
case 常量1:
语句序列1;
break;//break跳出switch语句结构
case 常量2:
语句序列2;
break;
......
default://上面case都不能执行时,执行这个语句
语句序列n;
}
数值溢出和损失问题
数值溢出
- 自动类型转换会发生的问题
- 取值范围大的类型转换成取值范围小的类型发生数值溢出
- 类型表数范围有限
整数的数值溢出
上溢出
- 一个数值运算结>类型能表示的最大数
- 进位超过最高位发生进位丢失
- 进位达到最高位改变符号位
浮点数的数值溢出
上溢出
- 浮点数运算结果>类型能表示的最大数
下溢出
- 浮点数运算结构<类型能表示的最小数
精度损失
- 高精度向低精度转换时发生精度损失
- float到int(丢失小数部分)
- 二进制小数与十进制小数之间很多不是一一对应的关系
- float能表示的有效数字为7位,double能表示的有效数字为16位
循环控制
计数控制循环
for语句
- 主要用于计数循环
for(表达式1;表达式2;表达式3)//表达式1初始条件,表达式2控制条件,表达式3转换条件
{
语句1;
语句n;
}
//执行顺序:表达式1,表达式2,语句,表达式3
逗号运算符
表达式1,表达式2,…,表达式n
for(表达式1,表达式n;表达式2;表达式3,表达式m)//逗号表达式主要用在循环语句中,同时对多个变量赋初值
{
语句1;
语句n;
}
while和do while语句
while语句
表达式1;//表达式1循环初始条件
while(表达式2)//表达式2循环控制条件
{
语句;
表达式3;//表达式3循环转换条件
}
//执行顺序:从上往下
- 当型循环
- 循环次数已知
do while语句
表达式1;//表达式1循环初始条件
do{
语句;
表达式3;//表达式3循环转换条件
}while(表达式2);//表达式2循环控制条件,表达式成立时继续循环
- 循环至少执行一次
- 直到型循环
- 循环次数可以不已知
选择循环语句一般原则
循环次数已知 | for语句 |
---|---|
循环次数未知,循环次数由一个给定条件控制 | while语句和do-while语句 |
循环体要执行一次 | do-while语句 |
递推
- 正向递推
- 反向逆推
穷举法
-
列举所有的可能,逐一试探
-
根据问题的部分已知条件预估解的范围
-
直到找到满足已知条件的解为止
Bug
程序常见错误
- 编译错误:语法错误
- 链接错误:缺少包含文件等
- 运行时错误:运行结果出错
调试方法
- 逆向推理:定位大致范围
- 分治排除:用注释切掉一些代码,调试无误打开
- 缩减输入:缩减输入数据
退出循环语句函数
goto语句
- 无条件转向语句
- 跳出多重循环
- 跳出共同的出口位置
- 不要使用过多的gotu语句标标号
- 题目:韩信点兵求至少多少兵
#include <stdio.h>
int main()
{
int x;
for(x=1;;x++)
{
if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
{
printf("x=%d\n",x );
goto END;//无条件转向语句
}
}
END: ;//标识(标识符)后面必须有语句,哪怕是空语句
return 0;
}
break语句
- 可用于跳出循环语句
- 跳出到紧接循环语句后的第一条语句
#include <stdio.h>
int main()
{
int x;
for(x=1;;x++)
{
if(x%5==1 && x%6==5 && x%7==4 && x%11==10)
{
printf("x=%d\n",x );
break;
}
}
return 0;
}
exit()函数
-
开头加入#include<stdlib.h>
-
终止整个程序运行,参数为0时,表程序正常退出;非0时表示非正常退出
#include <stdio.h> #include<stdlib.h> int main() { int x; for(x=1;;x++) { if(x%5==1 && x%6==5 && x%7==4 && x%11==10) { printf("x=%d\n",x ); exit(0); } } return 0; }
continue语句
- 继续循环这个语句
- 但是他要跳过continue后面的语句才执行循环,直到循环截止
#include <stdio.h>
int main()
{
int i,n;
for(i=1;i<5;i++)
{
printf("Please enter n:\n");
scanf("%d",&n);
if(n<0)
{
continue;//满足条件继续循环,换成break可对比
printf("n=%d\n",n );
}
}
printf("Program is over!\n");
return 0;
}