一、常量
什么是常量:程序运行期间不能变化的叫常量
100 默认int
100u unsigned int
100lu unsigned long
100llu unsigned long long
100l long
100ll long long
3.14 默认double
3.14f float
3.14l long double
无符号运算,算术运算默认返回无符号数,逻辑运算当然是返回0或1了。
问题:100年有多少秒?
#define SEC (3600*24*365*100u)
二、格式化输入输出
%nd 显示n个字符宽度,不够则补空格,右对齐
%-nd 显示n个字符宽度,不够则补空格,左对齐
%0nd 显示n个字符宽度,不够则补0,右对齐
%n.mf 显示n个字符宽度(小数点算一位),不够则补空格,m表示小数点后的位数(四舍五入)
%gc 不显示小数点后多余的0
三、运算符(优先级从高到低)
自变运算符:++/-- 使变量的值自动+1或者-1
前自变:++num --num 立即有效
后自变:num++ num-- 下一行语句有效
注意:不要在一行内多次使用自变运算符
算数运算符:+ - * / %
整数/整数 结果没有小数点
/ % 除数不能为0 出现错误:浮点数例外(核心以转储)
关系运算符 > < >= <= == !=
比较的结果必须是0或者1,比较的结果还能继续参与运算
int num = -5;
if(1 < num < 10)
永远为真,运算结果与数学不一样
注意:建议常量放左边
逻辑运算符 && || !
会先把运算对象转换成逻辑值,0转换为逻辑假,非0转换真
A && B 一假即假
A || B 一真即真
!A 求反
&& || 具有短路特性:当左边的运算对象已经能够确定整个表达式结果时,右边的所有运算对象不再计算
三目运算符 运算对象有三个部分
A ? B : C
判断A的值是否为真,如果为真执行B,否则执行C
该语句不能使用流程控制语句,因为它必须要有运算结果
赋值运算符 = +=
a += b; a = a + b;
a -= b; a = a - b;
a *= b;
a /= b;
...
位运算符 & | ~ >> <<
sizeof 也是运算符,但是sizeof括号内的表达式不会计算
四、类型转换
自动类型转换:
只有相同类型的数据才能运算,不同的类型的数据必须转换成相同的类型才能进行计算
转换规则:(以不丢失数据为基础,适当地牺牲一些空间)
1、字节少的向字节多的转(优先从高到低)
2、有符号的向无符号的转
3、整型向浮点型转
强制类型转换:
(新类型)数据
有丢失数据的风险,要慎重使用
五、分支转换
if(表达式)
{
表达式为真时,执行此处代码
}
if(表达式)
{
表达式为真时,执行此处代码
}
else
{
表达式为假时,执行此处代码
}
if(表达式)
{
表达式为真时,执行此处代码
}
else if(表达式2)
{
表达式2为真时,执行此处代码
}
else
{
表达式都为假时,最后执行此处代码
}
注意:大括号建议上下对齐
当分支语句只有一条时,大括号可以省略,但不建议省略
练习1:输入三个整数,从大到小显示?
练习2:输入一个年份,判断是闰年还是平年?
四闰百不闰,四百闰
练习3:输入一个年份和月份,判断该月有多少天?
练习4: 输入一个三位整数,判断是否为水仙花数?
练习5:输入一个成绩,判断等级
[100,90] A
(90,80] B
(80,70] C
(70,60] D
(60,0] E
other 输入成绩有误
六、开关语句
switch(n) //n可以是数值、表达式,运算结果必须是整数
{
case val: //val必须是整常量,如果val扥与n,则打开执行开关
...
break; //关闭执行开关
case val:
...
default:
...
//如果所有的case都没有匹配成功,则打开该执行开关,并且放在任何位置都会最后执行。
}
注意,如果每个case后都有break,就形成了分支结构
switch 不能与continue配合使用
注意:
case a ... b:可以表示一个范围a~b,但是属于GNU编译器独有的语法,不建议使用。
练习6:
输入一个月份,判断季节:
1 2 3 春天
4 5 6 夏天
7 8 9 秋天
10 11 10 冬天
other 输入月份有误
七、循环语句
循环就是让一段代码反复执行,达到想要的效果
for循环语句:
for是一种比较灵活且较危险(与其他循环相比)的一种循环
一般用一个变量引导for循环的运行,这个变量叫循环变量 i (index)
for([1];[2];[3])
{
[4];
}
1、给循环变量赋初值,C99标准才可以在此处定义循环变量
2、判断循环条件,一般判断循环变量是否到达边界
4、如果2为真,则执行此处代码,也叫循环体
3、改变循环变量,防止出现死循环,一般对循环变量自加或自减
1 2 4 3 2 4 3 2...
for循环的多种写法:
for(;;)
{
//死循环
}
int i=0
for(;i<10:i++)
{
}
for(int i=0;i<10;)
{
...
i++;
}
while循环: while(条件)//当条件为真时执行循环体,为假时结束循环 { //循环体 }
while循环相当于for循环的精简版本 for(;条件;)
for循环用来负责解决明确知道循环次数的问题
while循环负责解决只知道结束条件,而不确定循环次数的问题
do while 循环 do{ //循环体 }while(条件); //分号不能少 先执行循环体,再判断循环条件是否为真,该循环至少执行一次 适合先干活,再检查的特殊情况,例如:输入判断密码
问题:for、while、do-while 有什么区别
循环嵌套: 循环语句中包含循环语句 外层循环执行一次,内层循环执行n次
八、跳转语句
goto 可以在函数内任意跳转
它可能会破坏已近设置好的分支、循环语句,因此绝大多数公司禁止使用
但是它在驱动编程是特别适合用于处理异常
标签名:
...
goto 标签名;
练习7:不使用循环语句计算N的阶乘
break
1、配合switch使用,关闭执行开关
2、跳出循环,只能跳一层
continue
结束本次循环,直接进入下一次循环
return
1、返回一个数据给函数的调用者
2、立即结束函数的执行
练习8:不使用循环语句,计算前N项的斐波那契数列
九、数组
什么是数组:变量的组合,是一种批量定义变量的方式
定义:类型 数组名[数量];
int arr[5];
使用:数组名[下标];
下标:从零开始 范围:0~数量-1
遍历:与for循环配合,使用循环变量i当做数组的下标
初始化:类型 数组名[数量]={1,2,3,4.....};
1、数组与普通变量一样默认值是随机的,为了安全要对数组进行初始化
2、这种初始化语法只能在定义数组是使用,并且只能逐个复制,不能整体赋值
3、初始化的数据过多,编译器会产生警告并丢弃
4、初始化数据不足时,编译器会自动补0
5、初始化的数据可以省略,只写大括号,相当于给所有成员赋0
6、初始化数组是,长度可以省略,编译器会自动统计数据的个数然后告诉数组
数组的长度 = sizeof(arr)/sizeof(arr[0])
练习3:定义一个长度为10的数组并初始化,计算出该数组的最大值、最小值、平均值
练习4:定义一个长度为10的数组并初始化,进行升序排序
数组越界: 为了程序的运行效率是不会检查数组的下标
数组越界的后果:
1、一切正常
2、段错误
3、脏数据
练习9:定义一个长度为10的数组并初始化,找出数组中的第二大的值。不允许排序
|