c语言学习入门进阶(主要关注易错易混淆点)

目录

一、第一个c语言程序

 二、c语言的关键字

1、数据相关的关键字

 2、存储相关关键字

 3、控制语句相关关键字

4、其他关键字

 三、数据类型

1、常量和变量

2、整型

3、字符类型 char

 4、实型(浮点数)

 5、有符号数和无符号数

四、进制数 (了解)

无、原码、反码、补码(了解)

六、转义字符

七、类型转换

八、逻辑运算符&& || !

九、随机数

十、位运算(二进制位运算)

十一、逗号运算符:

十二、if语句        

十三、switch语句

十四、goto语句


一、第一个c语言程序

//  行注释

/*     */   这是块注释,可包含多行,不能 嵌套(块注释里面再写块注释)

mian   主函数,因main是函数调用的入口,故只有一个。

其他非main函数可以多个

在函数外定义的变量为全局变量,在复合语句中的变量定义的变量为局部变量

注:复合语句外的变量不一定是全局变量,因可能有复合语句嵌套。如果局部变量不初始化,内容不确定。

 二、c语言的关键字

1、数据相关的关键字

 char 、short、int 、long 、 float、double

 struct、union、enum 、signed、unsigned、void

计算机最小的存储单位二进制

计算机最小的分配单位字节 

char 字符类型 1字节

short 短整型 2字节

int 整型 4字节

long 长整型 4字节

float 单精度浮点数 4字节

double 双精度浮点数 8字节

struct结构体   union共用体   enum枚举  

signed有符号数   unsigned无符号数   

void 空类型

 2、存储相关关键字

register、static、const、aoto、extem

register:寄存器变量

(将变量直接放入寄存器中,提高访问效率,但不能对寄存器变量取地址)   

static:静态变量   

const:只读变量(只读变量只能初始化不能赋值)

aoto自动变量(默认定义的任何变量都是自动变量) 

extem:声明变量外部可用

 3、控制语句相关关键字

if、else、break、continue、for、while、do、switch、case、goto、default

if、else、switch、case、default:条件控制语句

for、while、continue、break、goto:循环控制语句

4、其他关键字

sizeof、typedef、volatile

sizeof测量类型的大小

typedef给类型取别名(别名一般为大写)

步骤:

1、先用 已有的类型 定义一个普通的变量

2、用别名 替换 变量名

3、在整个表达式最前方 加typedef

volatile防止编译器优化|强制只访问内存

 三、数据类型

1 char 、short、int 、long 、 float、double

2 struct、union、enum 、signed、unsigned、void 

1、常量和变量

常量:值不可修改,不允许被赋值。例:‘a’、‘1’、10、"hello world"、3.14f、3.14

变量:值可修改,系统自动根据变量的类型大小为变量开辟空间,变量名代表空间内容。

例:int num=10;

void num=10;//系统无法给num开辟空间(无法判断void大小),故定义会失败。

变量命名规则:变量名由字母、数字、下划线组成、不能以数字开头,不能是关键字。

2、整型

分为整型常量和整型变量。

变量的初始化:定义变量的时候给变量赋值。

一般变量初始化为0. 若先定义后赋值,则称为第一次赋值。

变量的使用:读(取值)/写(赋值) 特别地,num++;//读写操作

指数形式: 123e3 代表 123*(10的三次方)         123e-3代表123*(10的-3次方)

 变量的声明:先使用,后定义,必须事先声明变量,声明是还未开辟空间,故不要赋值。

获取键盘输入:scanf获取键盘输入函数

scanf和%d结合 只能提取数据 非数值 立即停止提取

键盘输入两个数,以整型为例:scanf(“%d %d”);

因scanf会省略空格,故%d之间空格可省,但最好不这么写。

3、字符类型 char

字符串常量如: 'a' '0' '2' '\0'

单引号 只能作用一个字符,转义字符除外。错误:'12'

单引号作用:1、'a' 描述a为字符 。2、取字符的ASCII值

printf %c 输出的是字符        printf %d输出的是字符的ASCII值

‘0’与‘\0'的区别:字符串'0' 计算机存的ASCII 48         '\0' 计算机存的ASCII 0

getchar();获取一个字符(包括空格、回车等转义字符)

字符的大小写转换:

 4、实型(浮点数)

单精度浮点数(float) 双精度浮点数(double)

1、实型常量 3.14 3.14f

不以f结尾的实型常量为double类型

以f结尾的实型常量为float类型

2、实型变量

 5、有符号数和无符号数

有符号数:

数据二进制的最高位为符号位 其他位为数据位。

最高位为1 表示负数 最高位为0 表示正数

无符号数: 没有符号位 所有二进制位都是数据位

输出有符号数:

1 %d输出有符号int

2 %hd输出有符号short

3 %ld输出有符号long

输出无符号数:

1 %u输出有符号unsigned int

2 %hu输出有符号unsigned short

3 %lu输出有符号unsigned long 

四、进制数 (了解)

二进制:0~1 c语言不能直接输出二进制

八进制:以0开头 0123 %o输出八进制 不区分正负数

十进制:123 %d %ld %hd %u %lu %hu

十六进制:以0x12 %x输出十六进制 不区分正负数

输出八进制或者十六进制时可以在%后加#以使打印的数据有进制区分。

无、原码、反码、补码(了解)

正数:补码==反码==原码

负数:反码==原码符号位不变 其他位按位取反。补码==反码+1

负数在计算机以补码的方式存储,将减法运算变加法运算,使计算机可以计算减法。

-10的无符号数是-10的补码。

对有符号变量负数进行有符号输出,将内存数据求补码(补码的补码即原码)输出,其他情况况均为内存原样输出。

六、转义字符

1、转义字符: \和某些字符 结合 产生新的字符含义

1 '\0' == ASCII 为0

2 '\n' == 换行符

3 '\t' == tab缩进符

4 '\r' ==回到行首符号

5 '\a' ==发出警报

用%c输出,也可在双引号内添加

2、八进制转义'\ddd' 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据

3、十六进制转义'\xhh' 每个h的范围0~9 a~f 2个h表示最多识别2位十六进制

七、类型转换

自动类型转换:保证精度不丢失,将小类型转成大类型

char/short→signed int→unsigined int→long/float→double

注:char和short类型只要参与运算就会转换成int类型。

强制类型转换:(类型说明符)(表达式)

不管自动类型转换还是强制类型转换都是临时的。

八、逻辑运算符&& || !

A&&B        逻辑与&&的短路特性:如果A为假,系统就不会再判断B的真假

A||B        逻辑或||的短路特性:如果A为真,系统就不会再判断B的真假

!           !真=假  在C语言中除0为假,其他都为真。

九、随机数

rand(); 设置固定随机数。

srand(100);设置随机数种子/基础值100,产生的随机数也为固定值。

srand(time(NULL));设置任意随机数

rand和srand头文件为#include<stdlib.h>

time的头文件为#include<time.h>

举例:

使用rand()产生60~100的随机数:rand()%41+60

使用rand()产生‘a’~‘z'的随机字母:rand()%26+'a'

十、位运算(二进制位运算)

1、&按位与  语法:全1为1,有0为0  运用场景:将指定位清0

案例:data1为1字节 将data的第3、4位清0,其他位不变

data=data&1110 0111;

data=data&0xe7;

data&=0xe7;

高级应用:data&=~(0x01<<3|0x<<4)        

 2、| 按位或  语法:有1为1,全0为0  运用场景:指定位置1

案例:data1为1字节 将data的第1、2位置1,其他位不变

data=data&0000 0110;

data=data&0x06;

data&=0x06;

高级应用:data|=(0x01<<1|0x<<2)

3、~按位取反 语法:0变1 1变0

4、^按位异或 

语法:不同为1,相同为0  特点:和1异或取反,和0异或不变

场景:将指定为翻转

5、左移<<:左边丢弃,右边补零       

移动的位数不超过自身位宽度        左移一位相当于原数乘2

6、右移>>:右边丢弃,左边补0/1

补1:算术右移        补0:逻辑右移

算术、逻辑右移都由编译器决定、用户无法确定。

无符号数:右边丢弃左边补0

有符号数:正数:右边丢弃左边补0

负数:右边丢弃左边补0(逻辑右移)        右边丢弃左边补1(算术右移)

若data为无符号数,右移一位相当于原数除二。

可以通过编写代码测试编译器为逻辑右移还是算术右移

十一、逗号运算符:

十二、if语句        

项目有多个结果,但不会同时出现:

if(条件1)

{        

        语句1;

}

else if(条件1)

{

        语句2;

}

else

{

        语句3;

}

若项目有多个结果,不确定同时出现,则没有else

十三、switch语句

switch(表达式1)

{

case 常量表达式1:语句1;break;

case 常量表达式2:语句2;break;

case 常量表达式3:语句3;break;

default:语句3;break;//可省

}

表达式1不能是实型和字符串

若多个case对应一个语句,可以写成 

case 值1:

case 值2:

语句;

break;

若其中一条语句没有break,则不会判断条件直接执行下一条语句,直至遇到break

十四、goto语句

作用:跳转

goto here;

here:

猜你喜欢

转载自blog.csdn.net/m0_75045191/article/details/130515011