第3章:C语言基础
1.数据类型
2.常量与变量
①常量:其值不发生变化的量
整型常量:0和正负整数
实型常量:小数型式和指数型式
字符型常量:' '括起来的一个字符或以\开头的字符序列
符号常量(宏): #define 符号名 常量
②变量:其值可以改变的量
每个变量都代表一块内存区域,区域的大小由类型确定
③变量名——以标识符命名
④标识符:由字母、数字或下划线组成;首字符为字母或下划线(不得为数字);用来标识变量、符号常量、数组、函数、文件等
⑤预定义标识符:一些预编译命令:include,define,或用函数的名称:sin,sqrt
⑥保留字(关键字):int for
⑦用户标识符:自定义,给变量,函数等命名(1.可以使用预定义标识符【但一般不用,容易混淆】2.不得使用保留字)
- 变量的定义
用变量定义语句定义变量及其类型
(1)变量定义语句的格式
(2)类型关键字:整型(int short long unsigned float)实型(float double) 字符型(char)
❗说明:
-
变量要先定义 后执行
-
C语言中整型和字符型数据通用
-
可在定义变量的同时给赋初值
-
变量名区分大小写
3.整形数据
-
C语言的整数由三种数制(十进制:以1~9开头的0~9的序列;十六进制:以“0x”或“0X”开头的0~9、A/a~F/f序列;八进制:以0开头的0~7序列)
-
小补充:①C语言中(十六位)长整型数用后缀“L”或“l”表示。②无符号数可以可以用后缀表示,整型常数的无符号数的后缀为“U”或“u”③前缀后缀可同时:0XB5Lu(十六进制无符号长整数)
-
整形数据在内存中的表示:整数不考虑正负,称为无符号数。考虑正负称为有符号数
❗❗
|类型标识符|字节数|范围| |-|-|-| |unsigned short| 2|-32768-32767| |(unsigned)int| 4| 2^31 (-2,147,483,648) 到正的 2^31-1 (2,147,483,647)| |unsigned long| 4|-2147483648~214748364|
小结:①常量:十进制,八进制,十六进制
②变量
③整型变量数的表示范围
④整型变量的分类:有/无符号基本整型;短整型;长整型
4.实型数据(浮点数)
-
指数形式:科学计数法由尾数部分、字符‘E’/‘e’与指数部分组成
例:-2.7E-2=$2.7\times10^{-2}$
-
实型变量:单精度(float型) 双精度(double型)
-
在一般系统中,一个float型数据在内存中占4个字节,单精度实数提供7~8位有效数字。一个double占8个字节,双精度实数提供15~16位有效数字,数值的范围随机器系统而异
-
实型常量的类型:实型常量按照双精度数处理,实型常量后加一个f或者F以表示单精度数
-
单精度变量有7~8位有效数字($10^{-37}$~$10^{38}$)双精度变量有15~16位有效数字($10^{-307}$~$10^{308}$)
5.字符型数据
- 字符型常量:
以单引号括起来的1个字符,计算机中占一个字节‘A’‘c’,单引号是定界符,不是字符常量的一部分。字符常量按照其在字符集(ASCII)中的编码值存储并参与运算
- 反斜杠字符常量(转义字符)
-
用来表示控制字符(如回车)和用于功能定义的字符
-
以‘\’开头,后跟字符或数字,用于表示一个特定含义的字符
-
例如‘\n’表示换行字符,成为转义字符,常与普通字符混杂于某个字符串中
需要记住的几个转义字符:
\a警报;\b退格(8);\f 换页符 ;\n换行(10);\r回车(13);\t水平制表符(9);\v垂直制表符;\反斜杠;\'单引号;\ooo八进制值;\xhh十六进制值
- 字符变量:
-
字符变量的取值是字符常量,即单个字符。字符变量的类型说明是char
-
字符值是以ASCII码的形式存放在在变量的内存单元之中的,所以只需要一个字节
-
C语言允许对整型变量赋字符型值,也允许对字符变量赋以整型值
-
输出时,可把字符常量以整型量型式输出,也可把整型量以字符形式输出
-
但整型量为4字节量,字符量为1字节量。所以把整型量按字符量处理时,只有低于8位(1字节)参与处理
- 字符串常量
“HOW ARE YOU”
注意:
-
没有字符串变量(可用字符数组存储)
-
字符串常量在内存中的存储形式:|C|H|I|N|A|\0|
-
字符串的长度就是字符个数。长度位n的字符串,占用n+1字节,最后一个字节存储字符为‘\0’
6.运算符
- C运算符简介
在C语言中,规定了运算符的优先级和结合性
优先级:C语言中,运算符的优先级分为了15级 1级最高,15级最低
表达式求值时,先做优先级高的操作,优先级相同时,运算次序由结合性决定
结合性:左结合性(先左后右)例:d=3*5/4;
右结合性(先右后左)例:d=a=3;
目数(元数):根据运算对象的数量,有单目运算符、双目、三目
- 算术运算符与算术表达式
①定义:用算术运算符和括号将运算对象连接起来且符合C语法规则的式子
②运算规则:
|优先级|运算符|结合方向| |-|-|-| |1|''|里层优先| |2|++ -- |自右至左| |3|* / %|自左至右| |4|+ -|自左至右|
③运算类型
-
双目运算符两边类型相同则运算结果类型不变
-
不同类型运算先按类型级别低向高转换成同一类型再计算
例:优先级和结合性:i、d、l整型、f是double
10 + 'a' + i * f - d/i
double int
注:表达式类型是最后一个运算符的类型
- 运算符 /(除)
①整数相除截去余数,此运算为整除
5/2=2(≠2.5) 1/3+1/3=0
②对于浮点数则为通常意义的除法
5.0/2.0=2.5
- (%模运算符)求余数
①用于计算两个数相除后得到的余数
如:a%b求的是a除以b后得到的余数
②运算对象只能是整型量,其结果也是整型量(其他算术运算符的运算对象可以是整数,也可能是浮点型)
如:5%2=1 3%3=0 3%5=3 'A'%2=1
③所得结果的符号与运算符左侧操作数(被除数)的符号相同
- 强制类型转换运算
(类型关键字)表达式
例: (int)a
(float)(5%3)
(double)(x+y)
注:(int)x+y取出x的值,转换为整型与y相加 int(x)是错误写法
①类型说明符必须加括号(若表达式为单个变量,可不加)如:“int(x+y)”是不对的,类型说明符必须要用括号给括起来
②强制转换只是取出变量的值进行转换,(并不改变变量的类型)
(int)(x+y)是将x+y的值转换为整数
(int)x+y是取出x的值,转换为整型与y相加
- 自增、自减运算
①运算规则
++i --i 使用前使i值加(减)1 【前缀先算】
i++ i-- 使用后使i值加(减)1 【后缀后算】
②只能用于变量
右结合方向: j=++i【i=i+1;j=i】
j=i++【j=i;i=i+1】
- 关系运算符与逻辑运算符
①关系运算符的优先顺序:> | ≥ | | ≤ | == | ≠ |从左到右依次降低
第一级:()第二级:单目 右 ~ ++ -- 第三级:* / % 第四级:+ - 第五级:>> ≥ < ≤ 第七级: == ≠
②逻辑运算符:
逻辑与(&&)、逻辑或(||)、逻辑非(!)
③逻辑表达式:
逻辑运算符与一个或两个操作数构成的表达式
运算结果:【真或假】
x && y :若x,y均为真,则结果为真,否则为假
x || y:若x,y均为假,则结果为假,否则为真
!x:若x为真,则结果为假,否则为真
运算优先级:
! && || (高>低)
说明:
①!的优先级高于算数运算符(第二级),&&(第11级)和||(第12级)的优先级低于关系运算符
②逻辑运算的结果只有真,假两种。分别用整数1、0去表示
③逻辑运算对象的值,可以是任何数据类型,非0则为真,0则为假
④分支或循环结构中的条件,可用数字(任意类型)表示,且非0数值表示真,真0表示假
❗⑤特例:逻辑表达式短路特性:计算逻辑表达式时,若计算到某步已经能确定整个表达式的值,则表达式中后面部分将不再被执行(总是先算表达式1)
&&:当表达式1为0时,表达式2不执行
||:当表达式1为1(非0)时,表达式2不执行
- 赋值运算符和赋值表达式
一:赋值运算符:将一个表达式的值赋给一个变量,14级,右结合
二:赋值表达式: =
注:左边一定是变量(或是数组元素)
赋值表达式:用赋值运算符所构成的表达式,赋值表达式的值是赋给左边变量的值
赋值语句:格式:变量名=表达式;
例:b=c+(int)a;
赋值语句对左边变量名或等价的数组元素实施写操作
分析"x = y = z = 10+b"
说明:①如果右边表达式的类型与左边变量类型不同,将发生类型(隐式)转换 例:int a = 9.9会自动转换成9
②右结合:例:x = -b / ( 2*a )
a=b=c=5
a=(b+4)+(c=6)
所以a=10
类型转换时,要注意避免精度的降低
- 复合赋值运算符(赋值自返运算符)
复合赋值运算符=运算符+赋值号
a+ =10 等价于 a=a+10
可以是任何类型:+= -= *= /=
以下不能是浮点数:%= >≥ <≤ &= ^= |=
- 条件运算符
条件运算符与条件表达式(13级,右)
格式:表达式1 ? 表达式2 :表达式3
计算过程:先计算表达式1的值,若为真,则结果为表达式2的值,否则为表达式3的值
例:x=(a>b)?a:b的值为a,b中的大者
y=(x≥0)?x:-x的值为x的绝对值
- 逗号运算符
用逗号将几个表达式连接起来而形成的表达式
一般形式:表达式1,表达式2,表达式3……
①逗号形式:按从左到右次序计算各表达式的值
②整个逗号表达式的值是最后一个表达式的值
- size of 运算符
一般形式:size of(操作对象)
单目运算符与所有单目运算符一样,优先级2,右结合
功能:计算操作对象所占内存空间的字节数
操作对象可以是变量名、数组名或类型说明符(也称类型标识符)
- 类型转换
不同类型数据进行运算时,必须按一定规则将数据转换成相同类型后再计算
①隐式类型转换
编译时由编译器按一定规则自动完成,分两种情况
a.赋值运算符两边类型不同:将右表达式的数据类型转换成与左变量类型一致。但将长型数据赋给短型变量,可能会造成数据丢失,故应该尽量避免
b.运算符两边类型不同:转换宗旨为由短型向长型转换,以免数据丢失
②显示类型转换
强制性转换
🥰1601zz的学习笔记
7.数据的输入输出
premise:①C语言中没有专门的输入输出语句
②C语言中的输入、输出是通过库函数来实现的
本节介绍4个函数
①格式输入输出函数 printf() scanf()
②字符输入输出函数 putchar() getchar()
- 格式输出函数:printf()
格式:printf("格式控制字符串"[输出表列]);
功能:按格式控制字符规定的格式,向标准输出设备(一般为显示器)输出表列中各输出项的值
格式控制:由双引号括起来的字符串,用于指定输入输出
普通字符:按原样输出的字符
格式说明:用来指定需输出数据的输出格式
形式:%[]
输出表列:需要输出的数据表列,彼此间用逗号分隔,可以是任意合法的表达式
①d格式符
作用:输出一个带符号的十进制整数(正数不输出符号)
格式: ①%md ②%ld(长整数)③%hd(短整数)
%d:按整型数据的实际长度输出
m:字段宽度(域宽场宽)
%ld:输出长整型数据(32位编译器不用加l)
%hd:输出短整型数据
②o、u、x格式符
作用:输出一个无符号的八进制、十六进制或十进制无符号整数
o:八进制 u:十进制 x:十六进制
③c格式符
作用:用来输出一个字符
注:一个整数,若是在0~127之间,可以用字符形式输出,系统会将该整数转换成对应的ASCII码字符
④s格式符
作用:用来输出一个字符串
格式:%s %ms %m.ns
m:输出的字符串占m列
n:输出字符串左端n个字符
注:m后面的是小数点
⑤f格式符
作用:以小数形式输出单双精度实数
格式:%f %m.nf
%f:整数部分全输出,隐含输出6位小数
m:字段宽度(整数、小数位数、数符、小数点)
n:小数位数的个数
⑥e格式符
作用:以标准化的指数形式输出实数(小数点前必须有且只有一位非0数字)
格式:%e %m.ne
%e:默认输出6位小数
m:字段宽度(指数部分占5列)
n:小数部分的位数
注意:输出表列可以是:变量、常数、数组元素、函数引用及带运算符的表达式
例:
printf("%f %d %d %f",3.14,a+b,x,cos(y));
"各输出项""各格式说明"需按顺序从左到右一一说明
错例:
实型数据用%d(o,x,u,c)输出 ❌
整型数据用%f %e %g输出 ❌
注意:格式说明个数<输出项时,多余的输出项不予输出
格式说明个数>输出项时,输出不定值
注意:可以在格式符的域宽前加0,用来补0【只能放在左端】
注意:可以在格式符前加*,用来读后面的一个数字(不常用)
- 格式输入函数 scanf()
格式:scanf("格式控制","地址表列");
功能:从指定的输入设备(键盘)把数据输入到指定变量中
scanf("%d,%d",&a,&b);
%d:格式说明
","逗号:普通字符
&a:地址表列
普通字符:需原样输入的字符
格式说明:用于指定需输入数据的输入格式 %[修饰符]格式字符
地址表列:给出各变量的地址
-地址是由&运算得到的
-&是取地址运算符,得到变量在内存中的地址。单目运算符,右结合性
注意:(1)输入数据时采用的分隔符应与格式控制中的分隔符一致。格式控制中无普通字符时,输入数值型数据可用空格、Tab键、回车键作分隔符
注意:(2)输入数据时不可指定精度,但可以指定宽度
例:scanf("%3d %2d %3c",&a,&b,&ch);
注意:(3)输入格式符带有*,表示该数据不赋值
例:scanf("%d %*d %d",&a,&c); 输入:123 输出:a=1,c=3
注意:(4)无符号可用%d、%o、%x格式输入
注意:(5)❗用c格式符输入字符时,空格、转义字符均为有效字符
例:scanf("%c %c %c",&a,&b,&c);
若键入ABC(enter) 则a=A b=B c=C
若键入ABC(enter)则a=A,b=_ c=B
若键入A(enter)B(enter)则a=A,b=(enter)c=B
注意:(6)%d %f %s等在读入数字时,前导的空白字符将被跳过,在下列情况可认为数据输入结束:①遇空格、回车、Tab键。②遇宽度结束。③非数值字符(h、x…)
注意:(7)double必用%f(或%le) float必用%f(或%e)
- 字符输出函数 putchar()
格式:putchar(c);
功能:向终端输出一个字符
说明:c为参数,可以是字符型变量、整型变量、字符型常量、表达式或转义字符,但只能是单个字符而不能是字符串
例:
#include<stdio.h>
main()
{
char ch = 'A';
printf("%c",ch);
putchar(ch);
printf("%c",65);
putchar(65);
putchar(10);
}
//结果是:AAAA
#include<stdio.h>
int main() {
char a = 'O';
int b = 75;
putchar(a);
putchar(b);
return 0;
}
//结果是:OK
- 字符输入函数 getchar()
格式:getchar();
功能:从键盘读入一个字符 char ch = getchar();
说明:①只能读取一个字符②该字符可赋给字符变量、整型变量或作为表达式的一部分
scanf("%c",&ch); == ch = getchar();