学习记录:第一周day03笔记

发布时间 2023-03-22 21:10:40作者: 菊里菊气

一、数据类型

为什么要对数据进行分类?

1、现实中的数据就是自带类别属性的

2、对数据进行分类可以节约内存存储空间、提高运行速度

存储空间的单位:

Bit 比特 存储1个二进制位,只能存储0或1,是计算机存储数据的最小单位

Byte 字节 存储8个二进制位,是计算机存储数据的基本单位

KB(Kb) 1024字节

MB(Mb) 1024KB

GB(Gb) 1024MB

TB(Tb) 1024GB

PB(Pb) 1024TB

 

 

C语言中的数据分为两大类别:自建(程序员自己设计的)、内建(C语言自带的)

sizeof:可以计算类型/变量所占内存字节数

内建类型:

1、整型:

(1)有符号(signed):二进制最高位作为符号位

类型名 字节数 数据范围

signed char 1 -128~127

signed short 2 -32768~32767

signed int 4 正负20亿左右

signed long 4(32位操作系统)/8(64位操作系统)

signed long long 8 正负9开头的19为整数

注意:有符号类型的signed可以不写

(2)无符号(unsigned):二进制最高位作为数据位

类型名 字节数 数据范围

unsigned char 1 0~255

unsigned short 2 0~65535

unsigned int 4 0~40亿

unsigned long 4(32位操作系统)/8(64位操作系统)

unsigned long long 8 0~1开头的20位整数

注意:由于定义无符号数据时比较麻烦,标准库中把这些类型重新定义成新的类型名

需要包含头文件<stdint.h>

uint8_t uint16_t uint32_t uint64_t

int8_t int16_t int32_t int64_t

2、浮点型:

float 4 单精度浮点型

double 8 双精度浮点型

long double 12/16

注意:采用科学计数法、在二进制与真实数据之间需要进行换算过程,因此浮点数的运算使用速度比整型慢得多,所以编程时尽量使用整型

注意:大多数操作系统只对小数点后6位有效

3、模拟型:

(1)字符型:char

字符就是图案或符号,字符在内存中依然存储成整数(存储的实际上是字符在字符集中的序号),需要显示成字符时,操作系统会根据ASCII码表(或其他字符集)中对应关系把整数显示成对应的图案或符号

'\0' 0 特殊字符 空字符

'0' 48

'A' 65

'a' 97

char想要显示成整数时:%hhd

想要显示成字符时:%c

(2)布尔型:bool

先有的C语言后有的bool类型,C语言中不可能有真正的布尔类型,都是在<stdbool.h>中对布尔类型使用整数进行模拟

C语言中没有布尔型的占位符,没办法直接使用printf打印布尔类型

 

 

二、变量与常量

什么是变量?

在程序运行期间值可以发生变化的叫做变量,相当于存放数据的盒子

定义:

类型名 变量名;

例如:int name;

取名规则:

1、由字母、数字、下划线组成

2、不能以数字开头

3、不能与C语言的关键字重名

4、见名知意(功能、类型、范围....)

下列哪些是正确的变量名(前三个):

printf scanf bool static 1num num%2

注意:内置类型在定义时若没有指定初始值,会执行默认初始化,它的值可能是未定义的

使用:

赋值: 变量名=val;

参与运算: 变量名*10

变量的输入、输出:

int printf(const char *format,...);

功能:输出数据

返回值:成功输出的字符个数

format:“提示信息+占位符”

...:变量名列表(可变参数)

类型占位符:C语言通过占位符的方式传递变量的类型

char short int long long long

signed %hhd %hd %d %ld %lld

unsigned %hhu %hu %u %lu %llu

float %f

double %lf

long double %LF

字符型(char):%q

练习1:定义并初始化所有类型的变量,使用printf显示

int scanf(const char *format,...);

功能:输入数据

返回值:成功输入的变量个数

format:“占位符”

...:变量地址列表(&变量名)

什么是常量:在程序运行期间数值不变化的叫做常量

10 默认int

10l long

10ll long long

10u unsigned int

10lu unsigned long

10llu unsigned long long

3.14 默认double

3.14f float

3.14lf long double

问题:定义一个表示100年总共有几秒的宏常量(忽略润平年)

#define SEC 3600* 24* 365*100u 需要注意整数常量默认是int

 C语言关键字:
  数据类型相关:
  内建类型:
  char short int long void float double 7个
  自建类型
  struct union enum sizeof 4个
  类型限定符
  auto   const static volatile register typedef   extern signed unsigned
  流程控制相关
  分支
  if else switch case default
  循环
  for while do
  跳转
  break return goto continue
 

三、数据的格式化输出

%nd 显示n个字符宽度,不足时补空格,右对齐(浮点数类型同理)

%-nd 显示n个字符宽度,不足时补空格,左对齐(浮点数类型同理)

%0nd 显示n个字符宽度,不足时补0,右对齐(浮点数类型同理)

%n.mf 显示n个字符宽度(小数点也算一位),不足时补空格,右对齐,小数点后显示m位(四舍五入)

%g 不显示小数点后多余的0

 

四、运算符

自变运算符

++/-- 让变量的值自动加1或减1

前自变:++/--num 立即有效

后自变:num++/-- 下一行语句才有效

注意:不要再一行代码中多次出现自变运算符

算术运算符

+ - * / %

/ % 除数不能为0,否则会在使用时(如打印)出现浮点数例外(核心已转储)

% 不能对浮点数求余

关系运算符

== != > < >= <=

得到比较的结果是1(成立)或0(不成立),比较的结果还可以继续参与运算

注意:建议常量放== !=的左边,防止少写一个=

逻辑运算符

&& | | !

会先把运算对象转化成逻辑值:非零转为真,0转为假

A && B 一假即假

A | | B 一真即真

!A 求反

&& 和 | | 的短路特性:

当左边部分的值已经可以确定整个逻辑运算符的结果时,那么右边不执行。

也可以借助短路特性,实现简单的单分支效果

三目运算符

A ? B : C

判断A的值如果为真(非0)则执行B,否则执行C

赋值运算符

= += -= *= ...

赋值运算表达式的返回值就是等号右边赋的值

位运算符

sizeof 也是一个运算符

 

五、类型转换问题

只有相同类型的数据才能进行运算,如果类型不相同的数据需要先转换成相同的类型才能运算

自动类型转换:

转换规则:以不丢失数据为基础,可以适当地牺牲一些空间

1、字节少向字节多的转

2、有符号向无符号转

3、整型向浮点型转

注意:优先级从高到低

例外(C语言陷阱):当运算对象类型只是char或short且类型不同时,编译器会做类型提升,提升为int再运算

强制类型转换:

(新类型名)数据;

有丢失数据的风险,但是需要使用时还是得用

 

 

六、if分支语句

单分支语句:

 if(表达式) 
 {
  //表达式的值为真(非0),执行此处代码  
 }

双分支语句:

 if(表达式) 
 {
     //表达式的值为真(非0),执行此处代码
 }
 else
 {
     //否则执行此处代码
 }

多分支语句

 if(表达式1)
 {
     //表达式1为真,则执行此处代码
 }
 else if(表达式2)
 {
     //表达式2为真,则执行此处代码
 }
 ...
 else
 {
     //所有表达式都为假,则执行此处代码
 }

 

七、switch开关语句

 switch(n)   //n可以是数值、表达式,结果必须是整数
 {
     case val1://val必须是常整数,如果n等于val,则打开执行开关
         break;//关闭执行开关
         //注意:continue不可以与switch配合
     case val2:
     default:  //如果所有的case都不打开,则最后打开此开关
         //无论位置在哪,都会最后执行(放其它位置的时候,要加上break)
         //不是一定要有
 }
 注意:
     case n1 ... n3:
  表示在范围[n1,n2]内,会打开case开关,但是这是属于GNU的特殊语法,不建议使用
     case 1:case 2:case 3:
  表示为值为1、2、3时,会打开case开关,执行相同代码,这是通用语法
 
 作业1:输入一个月份,判断季节
 作业2:输入一个月份,判断天数,忽略闰平年
 作业3:输入一个年份,判断闰平年
 作业4:输入三个整数,从小到大显示
 作业5:输入一个成绩,判断等级
    [100 90] A
    [89,80] B
    [79,70] C
    [69,60] D
    [59,0] E
     other 成绩有误
 作业6:输入一个三位整数,判断是否都是水仙花数