一、常量
什么是常量:程序运行期间数值不能变化的叫常量
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
问题:100年有多少秒?
#define SEC (3600*24*365*100u)
二、格式化输入输出
%nd 显示n个字符宽度,不够则补空格,右对齐
%-nd 显示n个字符宽度,不够则补空格,左对齐
%0nd 显示n个字符宽度,不够则补0,右对齐
%n.mf 显示n个字符宽度(小数点算以为),不够则补空格,m表示小数点后位数(四舍五入)
%g 不显示小数点后多余的0;
三、运算符
自变运算符: ++/-- 使变量的值自动+1/-1
前自变:++num --num 立即有效
后自变:num++ num-- 下一行语句生效
注意:不要在一行内多次使用自变运算符
算术运算符:+ - * / %
a%b 求余数
整数/整数 结果没有小数点,只保留整数部分,不四舍五入
/ % 除数不能为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 也是运算符,但其内部的表达式不会计算
四、类型转换
自动类型转换:
只有相同类型的数据才能运算,不同类型的数据必须转换成相同的类型才能继续计算
转换规则:(以不丢失数据为基础,适当的牺牲一些空间)
1、字节少的向字节多的转
2、有符号的向无符号的转
3、整型向浮点型转
强制类型转换:
(新类型)数据
有丢失数据的风险,要慎重使用
五、分支语句
if(表达式)//单分支
{
当表达式为真时,执行此处代码
}
if (表达式1) //多分支
{
当表达式为真时,执行此处代码
}
else if(表达式2)
{
当表达式2为真时,执行此处代码
}
else
{
当表达式都为假时,最后执行此处代码
}
注意:大括号建议上下对齐
当分支语句只有一条时,大括号可以省略,但不建议省略
练习1:输入三个整数,从大到小显示
练习2:输入一个年份,判断是闰年还是平年
四闰白白不闰,四百闰
练习3:输入一个年份和月份,判断该月有多少天?
练习4:输入一个三位整数,判断是否是水仙花数?
练习5:输入一个成绩,判断等级
[90,100] A
[80,90) B
[70,80) C
[60,70) D
[0,60) E
other 输入成绩有误
六、开关语句
switch(n) //可以是数值也、表达式,运算的结果必须是整数
{
case val: //val 必须是整常量,如果val等于n,则打开执行开关
...
break; //关闭执行开关
case val
...
default:
...
// 如果所有的case都没有匹配成功,则打开该执行开关,并且放在任何位置都会最后执行
}
注意:如果每个case后都有break,就形成了分支结构
switch不能与continue配合使用
注意: case a ... b:可以表示一个范围a~b,但是属于GNU编译器独有的语法,不建议使用
练习六:输入一个月份,判断季节;
1 2 3 春天
4 5 6 夏天
7 8 9 秋天
10 11 12 冬天
other 输入月份有误
七、循环语句
循环就是让一段代码反复执行,最终达到想要的效果
for循环语句:
for 是一种比较灵活且较危险(与其他循环相比)的一种循环
一般用一个变量来引导for循环的运行,这个变量叫做循环变量 i
for([1];[2];[3])
{
[4];
}
1、给循环变量赋初值,C99标准才可以在此处定义循环变量
2、判断循环条件,一般判断循环变量是否到达了边界
4、条件2为真,则执行此处代码,也叫循环体
3、改变循环变量,防止出现死循环,一般对循环变量进行自加或自减
1 2 4 3 2 4 3 2 4 3 ... 2 4 3 ...
for 循环的多种写法:
for(;;)
{
//死循环
}
------------------
int i=0;
for(;i<10;i++)
{
}
------------------
for(int i;i<0;)
{
...
i++;
}
------------------
while循环:
while(条件) //当条件为真时执行循环体,为假时结束循环
{
//循环体
}
while循环相当于for循环的精简版本 for(;条件;)
for循环负责解决明确知道循环次数的问题
while循环负责解决只知道结束条件,而不确定循环次数的问题
do while循环:
do{
//循环体
}while(条件); //分号不能少
先执行循环体,才判断循环条件是否为真,该循环至少执行一次
适合先干活,再检查的特殊情况,例如:输入判断密码
/*问题:for、while、do-while 有什么区别
1、初始化变量。
for循环当中定义的初始化变量,只有自己才能用;while和do-while循环,初始化变量本来就在外面,所以外面也照样可以使用(定义在循环体里的局部变量,在栈内运行完释放,并不保存)。
2、执行次数。
for循环和while循环是【先判断后执行】,但是do-while循环是【先执行后判断】。
3、使用的普遍性不同。
绝大多数情况下,三种循环可以来回转换。但是凡是次数确定、范围确定的情况,使用for循环。*/
循环嵌套:
循环语句中包含循环语句
外层循环执行一次,内层循环执行n次
作业1:计算出所有的水仙花数
作业2:输入一个正整数,判断是否是素数
作业3:输入一个正整数,判断是否是回文数 12321
作业4:输入一个6位密码,输入正确显示"登陆成功",输入错误提示"还剩几次机会",可以继续输入,最多输错三次,否则显示"账号已锁定",并结束
作业5:输入一个整数,分解显示
-12234 - 1 2 3 4
-------------------------------------------------------------------------------------------------------------------------------
复习:
1、C代码变成可执行程序的过程
预处理:查看宏函数的替换结果,检查宏函数
gcc -E
编译:理解C代码的底层原理,函数重载
gcc -S
汇编:生成代码库、静态库、共享库
gcc -c
链接:是多文件编程的基础
gcc a.o b.o c.o ...
2、gcc编译器常用参数
-E -S -c -std=gnu99 -o -I -l -Wall -Werror -D(命令行定义宏)
3、C语言文件类型
.h .h.gch .c .i .s .o .a(静态库) .so(共享库)
4、数据类型
signed char 1 %hhd -128~127
signed short 2 %hd -32768~32767
signed int 4 %d 正负20亿
signed long 4/8 %ld //32位操作系统是4,64位操作系统是8
signed long long 8 %lld 正负9开头的19位数
unsigned char 1 %hhu 0~255
unsigned short 2 %hu 0~65535
unsigned int 4 %u 0~40亿
unsigned long 4/8 %lu //32位操作系统是4,64位操作系统是8
unsigned long long 8 %llu 0~1开头的20位整数
float 4 %f
double 8 %lf
long double 12/16 %LF
小数点后6位数
问:有float x; 如何判断x与零值是否相等
if(0==x)
if(x<0.000001 && x>-0.000001)
5、 C变量名取名规则
(1) 必须由字母、数字、下划线组成
(2) 必须由字母或下划线开头
(3) 不能与32个关键词重名
(4) 见名知意
6、变量输入输出
printf 提示信息+占位符+变量名列表
scanf 占位符+变量地址列表
%nd %-nd %n.mf(5舍6入) %g
7、运算符
/ % 除数不能为0,浮点数例外(核心已转储)
== 变量尽量在右边
++/-- 尽量不要在一行内多次使用
&&/|| 具有短路特性
注意:运算符也是有优先级的
8、类型转换
自动类型转换:不同类型数据之间需要先转换为相同的类型数据才能进行运算
1)字节少的向字节多的转
2)有符号的向无符号的转
3)整型向浮点型转
注意:以不丢失数据为基础,可以适当地牺牲空间
强制类型转换:
(新类型)数据 有丢失数据的风险,谨慎使用