C语言基础:04天笔记
内容提要
- 回顾
- C语言
- 数据的输入输出
回顾
运算符
算术运算符
结果:数值
+ - * / % +(正) -(负) ++ --
i++和++i
相同点:i自身都会增1
不同点:他们运算的最终结果是不同的. i++先使用 ,后加1; ++i先计算,后使用
赋值运算符
结果:赋值后的变量的值
赋值顺序:由右到左
= += -= *= /= %=
关系运算符
表达式 = 运算符 + 运算数
关系表达式 = 关系运算符 + 运算数
结果: 布尔类型(默认结果:0代表假,非0代表真,引入stdbool.h文件,false代表假,true代表真)
> < >= <= == !=
注意:
1. 两个浮点型数据比较的时候,不能使用==,因为比较出来的结果是不确定的,解决方案: 参与比较的两个操作数相减然后和0比较
逻辑运算符
结果:布尔类型
&& || !
&&
运算符左右两侧表达式都成立,则结果为真,有一个不成立,则结果为假
||
运算符左右两侧表达式都不成立,则结果为假,有一个成立,则结果为真
!
对原操作数或者表达式结果取反,如果原操作数或者表达式结果为真,最终结果为假;反之结果为真
惰性运算
惰性运算的目的减少运算的次数,从而提供运算效率
短路与:如果&&左侧表达式返回假,就不再执行右侧表达式,最终结果就是与左侧表达式相同的结果
短路或:如果||左侧表达式为真,就不再执行右侧表达式,最终返回的结果就是左侧表达式的结果
逗号运算符
结果:最后一个表达式的结果
语法:表达式1,表达式2,表达式3.....
位运算
所谓的位运算,就是计算机底层直接针对二进制位进行操作
~ & | ^ << >>
~:按位取反,单目运算,针对二进制位,每一位进行取反,如果二进制0变1,1变0
&:按位与,双目运算,两个数相同二进制位,如果都为1结果为1,否则结果为0
|: 按位或,双目运算,两个数相同二进制位,有一个为1,结果为1,否则结果为0
^:按位异或:双目运算,两个数相同二进制位,结果为0,否则结果为1
<<:左移:分为无符号左移和有符号左移,所有二进制位从低位到高位依次左移,超出部分舍弃,缺失部分使用0补齐
>>
:右移:分为无符号左移和有符号右移,所有二进制位从低位到高位依次左移,超出部分舍弃
无符号右移:直接补0
有符号右移:算术右移,默认补1. 逻辑右移,补0由计算机系统决定
流程控制
C语句
定义
- C程序是以函数为基础单位的
- 一个函数的执行部分是若干条语句
- C语句都是用来完成一定的操作任务
- C语句必须依赖于函数存在
C程序结构
C语句分类
控制语句
用于完成一定的控制功能
- if…else…
- for…
- while…
- do…while…
- continue…
- break
- switch
- return
- goto
函数调用语句
由一个函数调用加一个分号组成,例如:
printf ("这是一个C程序 \n");
test();
表达式语句
由一个表达式加一个分号构成,最典型的表达式语句就是赋值语句,例如:
a = 3 //是一个表达式
score > 90 //是一个表达式
score = 90; //是一个表达式语句
空语句
只有一个分号,什么都不做,例如
;
复合语句
用"(…)"括起来的若干个语句,例如
{z = x + yt = z / 100printf("%f\n",t);
}
一般形式为:{语句部分;}
数据的输入输出
数据的输入与输出是相对而言,其中:
- 从计算机向外部设备输送数据称之为输出(output).通常的输出设备包括:显示器,打印机等
- 从外部设备向计算机输送数据称之为输入(input).通常的输出设备包括:键盘.鼠标.扫描仪等
在C语言中,输入与输出需要使用标准的输入输出库(stdio)中的输入函数(scanf), 输出函数(printf)实现
库函数已经被编译成了目标文件,在链接时与编译源程序得到的目标文件(.obj)相链接,生成可执行程序.
注意:在使用系统库函数时,要用预处理指令# include将有关的头文件包含到用于源文件中(要放在程序的开头位置)头文件中包含了调用函数时需要的有关信息,具体的函数在编译时再去链接对应的系统库
简单的输入输出
用简单的printf函数输出数据
语法:
printf("格式控制",输出列表);
注意:格式控制中的格式化符号(如%d)要和输出的数据一一对应
举例:
printf("i=%d,x=%d,y=%d\n",i,32.i+1)
格式控制:用哪个一对英文双引号括起来,包括两种信息
-
格式说明:由%d和特定字符组成,如:%d %f %u等,用于说明输出项目所采用的格式
-
普通字符:作为说明性文字.符号等,照原样显示出来.
输出列表:输出列表中的各项目指出了所要输出的内容,可以是常量,变量,表达式
基本的格式字符
%d 按有符号十进制整型(int)数据的实际长度输出。(十进制(0)、八进制(00)、十六进
制(0x00))
%u 按无符号十进制整型(int)数据的实际长度输出。
%c 仅输出一个字符(char)
%s 输出结果是字符串,举例:printf(“%s\n”,“CHINA”);,输出结果:CHINA
%f 以小数形式输出一个实数(涵单双精度)。整数部分全部输出,小数部分输出6位。
%e 也可以写作%E,以指数形式输出一个实数(涵单双精度)。小数点前1位非0数字,并输出6
位小数。
%hd 短整型(short int/short)
%hhd 字符型的ASCII码,char数据对应的ASCII码的值,举例:char a = ‘A’;printf(“%hhd\n”,a);,输
出结果:65
%lf 双精度浮点型(double)
%ld 长整型(long int/long)
%lld 长长整型(long long int/long long)
%x 十六进制,但是十六进制的前缀0x不会打印出来,举例:printf(“%x,%#x\n”,198,198);,输
出结果:c6,0xc6
%#x 十六进制,并且十六进制的前缀0x也会打印出来,举例:0x05
%#o 八进制,并且八进制的前缀0也会打印出来,举例:05
%p 打印内存的地址
用简单的scanf函数输入数据
语法:
scanf("格式控制",地址列表);
注意: 不能传变量, 常量, 表达式, 只能传与之对应的内存地址(首地址)
举例
int a = 10; //定义了一个变量a
scanf("%d",&a);//&被称作取地址符,&a意思是获取a变量对应的内存地址(首地址)
printf("%p\n",a);//打印输出a的内存地址(首地址)
作用:将从键盘输出的值所占的存储单元中,存储单元有地址标识.
说明:
-
格式控制: 含义等同于printf函数的格式控制, 说明输入的数据应该使用的格式, 但是格式控制中不能添加格式化外的字符
-
地址列表: 是若干个地址组成的,可以是变量的地址或者字符串的首地址,&是取地址运算符,用于去除变量的地址.与格式化输出一样,在格式控制中,用于说明数据格式的格式说明符以%开头,后面紧跟具体的格式
案例: -
需求: 从键盘输入整数给变量abc
-
代码:
-
#include <stdio.h>int main() {a//定义三个变量abc,用来接受控制台的输入int a,b,c;// 加一个信息,这样效果好一点printf("请输入三个整数:\n");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c); }
-
-
说明:
-
scanf函数中的"格式控制"后面应当是变量的地址.由取地址运算符&和变量名共同组成,
不能仅是变量名:scanf(“%f%d”,&a,&b);
-
如果"格式控制"中除了格式说明以外还有其他字符,则在输入数据是必须在对应位置输入与之相同的字符:
scanf(“%d,%d”,&a,&b)
从键盘录入的时候必须输入逗号:3,4
scanf(“%d年%d月%d日”,&a,&b,&c)
必须输入2025年2月10日
-
用%c格式输入字符时,空格和转义字符(\n)都作为有效字符输入,应注意:
scanf(“%c%c%c”,&a,&b&c);
只有输入xyz
也能得到a=x,b=y.c=z
- 在输入数值型数据(整型)
-
复杂的输入与输出
按指定格式输出数据的宽度,小数位数,上下行数据按小数点对齐,用八进制,十六进制输出等
输出数据格式的控制
整型格式说明符
-
十进制形式(0~9)
-
八进制形式(0~7)
-
十六进制形式(0~F)
m表示输出整型数据所占总宽度(即列数),其中
-
当实际数据的位数不到m位时,数据前面将用空格填满
-
若实际数据的位数大于等于m位时,则以数据的实际位数为准进行输出
一个int整型也可以用%u输出,反之一个unsigned整数也可以用%d,%o,%x格式输出,按相互复制的规则处理
字符型格式说明符
-
字符型
-
字符串型
在C语言中,是支持字符串常量的,但是不支持字符串变量.
注意:因笔记中♦代替空格
一个整数,只要其值在0~255范围内,也可以用%c格式按其字符形式输出.这里0-127对应ASCII码
在输出前,系统会自动将整数作为ascii码转为相应的字符,反之也成立
案例:
-
要求:字符串输出
-
代码
#include <stdio.h>int main () {printf("%3s,%7.2s,%-5.3s,%.4s\n","CHINA","CHINA","CHINA","CHINA") }
-
运行结果
CHINA,-----CH,CHI--,CHIN
浮点型格式说明符
-
-
浮点型格式分为三种形式
- 十进制形式:
%m.nf
或者%-m.nf
- 指数形式:
%m.ne
或者%-m.ne
- %g或者%G形式,根据数值的大小 自动选择%f或者%e中宽度较短的一种格式,不输出无意义的0
- 十进制形式:
解释:
在输出浮点型数据时,格式说明符中的m表示整个数据所占的列宽,n表示小数点后面所占的位数(保留的小数位)
如果在小数点后取n位后,所规定的数据宽m不够输出数据前面的整数部分(包括小数点),则按实际 的位数进行输出
在C语言中,用于输出单精度浮点型与双精度浮点型数据格式说明符是一样的
案例:
代码
#include <stdio.h>int main()
{float f = 123.456printf("%8.2f,%-8.2f,%8.6f,%8.2e,%g\n",f,f,f,f,f")
}
结果:
_ _123.46, 123.46- - , 123.45601, 1.2e+02, 123.456
案例:
浮点型格式说明符
-
单精度浮点型: %f或者%e
-
双 精度浮点型: %lf
可见:
① 与输出不同,输入时无论是单精度还是双精度浮点型,都不能用m.n来指定输出的宽度和小数点后的位数
②可以指定输入数据所占的列数,系统自动按他截取所需数据,如scanf(“%3d%3d”,&a,&b);当输入1234567时,a得到123,b得到456,多余的7无用
③若在%后有一个
*
和一个数字,表示跳过他指定的列数,如:
scanf("%2d%*3d%3d,&a,&b")
当输入12345678时,a得到12,%*3d表示跳过3列,b得到678
案例:
#include <stdio.h>int main(){int a,b;scanf("%3d%3d",&a,&b);//}