C语言学习笔记1——零散基础知识

我的c语言学习之路是课本《c程序设计》+“面向百度编程”,利用写博客的形式来监督自己去奋斗。在写这篇博文时我已经学完c语言很久了,但为了考证和出来工作的,我不得不再次巩固自己的基础,所以我采用 知识点+实战 的形式来进行复习。
#前面的知识比较零散#

#include <stdio.h>
int main()
{
    printf("Hello World!\n");    // 打印输出字符串“Hello World!”
    return 0;
}

运行结果是:在屏幕上输出 Hello World!

通过上方的一段最简单的程序来介绍一些零散的知识点

1、 开头的 #include指令

作用是把头文件中的信息、代码调入供使用,是对编译进行预处理的指令,
stdio.h是一个头文件,里面包含了标准函数库中的一些函数(如:输入输出函数)
格式:#include<xxx.h>或者#include"xxx.h"
(两者区别:< >:是调用系统函数库里面的头文件," ":是调用工程文件下自己写的头文件)

2、 int main(void) :

是主函数,整个程序的起始位置,从main()函数开始,从main()函数结束。
C99标准中,建议把main函数指定为int型(整形),要求函数结束时带回一个整数值。也正因为定义为int型,所以在结束时需要 “return 0;”。
“return 0;”的作用是:当主函数正常结束时,得到的函数值为0,当执行时出现异常或错误时,函数返回值为非0的整数值。所以可以通过该值判断是否正常执行。

3、 return:

作用:结束正在运行的函数,并返回函数值。
返回值:可以是常量、变量或是表达式,可以是各种形式(int、char、数组、指针、结构体等)
用法:
(1)返回函数值(典型例子:递归);
(2)返回一个函数值,并跳出当前函数;
(3)跳出循环并且跳出当前函数,同时返回函数值;

*注意*:
(1)只有void(空型)不需要return,其余都有return。
(2)在一个函数中,如果碰见return语句,那么程序就返回调用该函数的下一条语句执行,
也就是说跳出在运行的函数,返回到原来的位置继续执行下去,如果是主函数上的return,
则直接结束程序。

4、 C语言的注释方式:

// 或 /* */ (“// xxx ”是单行注释,“ /*xxx */ ” 是多行一次过注释)

5、 结束标志

每一条语句的结束都以“;”来做标志。

6、 c语言的基本框架

一个c语言程序的最基本框架:头文件、主函数
#include<stdio.h>
int main( )
{
return 0;
}

7、 算法的三个基本结构

算法的三个基本结构:顺序结构、选择结构、循环结构

8、 37个关键字:

auto、break、case、char、const、continue、default、do、double 、else、 enum、extern、float、for、 goto、if、inline、int、long、register、restrict、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while、_bool 、_Complex 、_Imaginary

9、 常见转义字符:

转义字符结果
\’输出一个单引号( ’ )
\"输出一个双引号( " )
\?输出一个问号
\a产生警告(声音或视觉信号)
\b退格,将光标前移一个字位置,若 \b 后还有字符,则会覆盖这个字符
\f换页,将当前位置移到下一页的开头(具体效果我测试出来只是一个向上的箭头,效果怎么样感受不出)
\n换行
\r回车,将光标当前位置移动本行的开头
\t水平制表符一个(一个tab键)
\v垂直制表符一个(这个也测试不出效果,只有一个方框)

10、 常量与变量

常量 :在运行过程中,其值不能被改变。

注意点:
(1)指数形式的表示方式:e或E代表以10为底的指数,如:12.34e3(12.34*10^3^)
e或E之前必须有数字且不能为0,e或E后面必须为整数。

(2)C语言只是规定:基本字符集中的每一个字符必须用一个字节表示,空字符也占一个字节,它所有二进位都是0。字符的存储一般以ASCII码的形式来存,具有代表性的字符 “ 0 ” 对应的ASCII码为:48,“ A ” 对应的ASCII码为:65,“ a ” 对应的ASCII码为:97。(大写字母与小写字母的ASCII码相差32)。

(3)’ ’ 单引号是一个字符," "双引号是字符串(多字符)

(4)符号常量用法:用 #define 指令,指定用一个符号名称代表一个常量,常用于定义宏。
格式:#define 代表的名字 原常量
如: #define PI 3.14
含义:用 “ PI ” 这个代表3.14

*特别注意*:要区分符号常量与变量,不要把符号常量误认为变量,符号常量不占内存,
#define是一个预编译指令,只是一个临时符号,在预编译后这个字符就不存在了。为了
与变量名区分,习惯上符号常量采用大写来表示。

变量: 一个有名字的、具有特定属性的一个存储单元。它用来存放数据(存放变量的值),在运行时值能改变的。
使用方式: 在使用变量时要“ 先定义后使用 ”
定义格式:类型 变量名;或者 类型 变量名=数值;
命名规则:(1)只能由字母、数字和下划线 3种字符组成(2)第一个字符必须为字母或下划线。(3)不能使用系统的保留字、关键字(4)严格区分字母大小写。

注意 : 变量名实际上是一个存储地址

常变量:
如:const int a=3; 表示a被定义为一个整形变量,指定其值为3,而且在变量存在期间其值不能改变。
常变量与变量的异同是:
常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值。通俗讲就是有名字的不变量,而常量是没有名字的不变量。

11、 基本数据类型:

以下是以VC++的编译系统而言(*注意:*编译系统不同而导致占用内存不同)

1、整形:存储方式都是补码形式,存储单元的第一个二进位制代表符号位。
(1)int(整形):4个字节, 取值范围:-231 ~(231 -1)
(2)short int 或 short(短整形):2个字节, 取值范围:-215 ~(215 -1)
(3)long int 或 long(长整形):4个字节, 取值范围:-231 ~(231 -1)
(4)long long int 或long long(双长整形):8个字节, 取值范围:-263 ~(263 -1)

2、char(字符型):字符是按其代码(整数)形式存储的,所以字符型数据也作为整型的一种。
一般系统采用的ASCII字符集。

注意:
signed 与 unsigned 在char中的使用与对于其他类型来说是不一样的。
signed char(有符号字符型):  字节数:1、取值范围:-128 ~ 127 ,即-2^7 ~ 2^7 -1)。
unsigned char(有符号字符型):  字节数:1、取值范围:0 ~ 255(即0 ~ 2^8^ -1)。
虽然有符号的可以存负数,但实际上字符的代码不可能为负数,所以实际上只用到0~127,
其第一位都是0

3、浮点型:用来存小数的。
float(单精度浮点型)4字节,6位有效数字
double(双精度浮点型)8字节,15位有效数字
long double(长双精度)8字节,15位有效数字
在算术运算中,float类型会自动转换成double类型进行运算。

注意:
【1】 1个字节=8位
【2】unsigned (无符号类型)的取值范围是从0开始,没有负数,然后上限的次方数加一(因为没有了符号,可以多了一个位来存数),输出十进制格式 : “ %u ”。
如:unsigned int(无符号基本整形):4个字节,取值范围:0 ~(232 -1)
【3】有符号类型:signed,但通常都是省略不写,默认是有符号类型。最高位是符号位,0代表正,1代表负。
【4】sizeof():是要来测量类型或变量长度的运算符。

12、强制类型转换

强制类型转换的方式:(类型名)(表达式) 如:(double)a 、(int)(x+y)

13、 运算符

1、基本算术运算符注意事项
除法:“ / ” 是取商(取整数部分,不进行四舍五入),“ % ” 是取余 。

2、自增(++)、自减(- -)运算符
作用是使变量的值 加1 或 减 1
++i,–i :在使用 i 之前,先使 i 的值加(减)1
i++,i-- :在使用 i 之后,使 i 的值加(减)1
例:
a = 2,b = ++a —> a=3,b=3(过程分析:a先自加1变成3,然后b再等于a的新值(3),所以b的结果为3)
a = 2,b = a++ —> a=3,b=2(过程分析:先执行b=a先,然后再执行a的自加)
(备注:变量默认值为 0)

3、运算符优先级
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14、 控制语句(c语言只有9种)

1、条件语句:if(判断条件)……else……
2、循环语句:for(判断条件)…… ;while(判断条件)…… ;do……while(判断条件)
3、结束本次循环:continue
4、中止执行switch或循环语句:break
5、多分支语句:switch
6、从函数返回语句:return
7、转向语句:goto(注意:在结构化程序中基本不用goto语句)

15、 最基本的语句——赋值语句

最简单的赋值符号:“ = ”等于号

复合的赋值运算符:由等于号加上其他运算符组成,有+= 、-= 、*= 、/= 、%=。如:a+=3 等价于a=a+3,x*=y+8 等价于x=x*(y+8)

赋值表达式:变量 = 表达式

注意:表达式中也可以是一个赋值表达式;等号也可以是复合的赋值运算符。

16、 空语句

格式:;(只有一个分号“ ;”)

作用:

1.起到延时的作用
如:for(i=0;i<255;i++)
        for(j=0;j<255;j++);

2.为了程序的结构清楚,可读性好
如:  原本的            用空语句后
 	if(xxx)          if(xxx)
	{                     {
		xxx;                 xxx;
	}                      }
					   	else{
						     ;
						}
						
3.以后扩充新功能方便。先将函数名写上,随后再添加。

4.对于某些大型的软件项目,特别是一些嵌入式项目,处于自动化测试的需要,
  要求必须进行语句(例如,if/else语句)的配对。
  在进行代码静态解析,单体测试Case抽出的时候,为了保证全路径覆盖,很
  多专业的高端自动测试工具,会建议进行语句(例如,if/else语句)的配对。
  此时对于一些不完备的分支,就会用空语句补全。


————————————————
版权声明:本文为CSDN博主「独孤星燎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38239856/article/details/70477347

17、输入输出

1、输入输出是以计算机主机为主体而言,输出:从计算机中出去;输入:进入到计算机。

2、c语言本身不提供输入输出语句,输入和输出操作是由c标准函数库中的函数来实现的。

3、格式控制符:
(1) 有符号的十进制整型:%d 、%nd(可以指定输出数据的域宽,n为域宽,即多少个字位)
(2) 长整型:%ld
(3) 双长整型:%lld
(4) 字符型:%c
(5) 字符串型:%s
(6) 浮点型:%f 、 %m.nf(m:宽度,即算上小数一共m个数字;n:保留n位小数)

注意:1、在使用%f 时要注意数据本身能提供的有效数字,float:6位,double:15位。
2、输出数据向左对齐,可以在%后加“ - ”负号,格式 :%-m.nf

(7) 以指数形式输出:%e 、%m.ne(若不指定输出数据所占的宽度和小数位,那默认为6位小数,6位中指数部分占5位,指数部分中“e”占1位,指数符号占1位,指数占3位。若按标准化指数形式,小数点前必须有且只有1位非零数字)
如:默认情况下:
printf(“%e”,123.456);
输出:1.234560e+002 所以一共占13个位宽度。

注意:e也可以写成E,输出时小写对小写,大写对大写。

以上是常用的以下是比较少用的

(8) %i :跟%d 的作用相同,但通常习惯用%d。
(9) %o:八进制整型输出
(10) %x:十六进制整形输出(%lx:输出长整形数;%lnx:指定输出字段的宽度为n)
(11) %u:无符号型(unsigned),以十进制整数形式输出
(12) % g:用来输出浮点数,系统自动选择%f 或 %e,选择其长度较短的格式,不输出0。

注意:若要输出%,则连续两个%即可。

4、输入:scanf(格式输入)、getchar(输入字符)、gets(输入字符串)

(1)scanf
输入格式:(“格式控制”,地址表列) 如:scanf(“a=%d,b=%f,c=%c”,&a,&b,&c);
在这里插入图片描述

格式控制:由 “ 格式声明 ” 与 “ 普通字符 ” 两个组成 。
格式声明:由 % + 格式字符(如:d、f、c 等) 组成。作用:将输出的数据转换为指定的格式
来输出。
普通字符:是需要原样输出的字符。如:双引号中的逗号。(即:双引号中除了格式控制符以
外的字符)
地址表列:需要输入值的地址(可以是变量的地址,或字符串的地址)。

输入时使用的注意事项:
1、“格式控制”后应当是变量地址,而不是变量名。【记得在变量名前加取地址符号(&)】
2、在输入的时候,除了格式声明(%d这些)用需要的值替代外,其余必须与原本一样,
多一个或少一个字符都不可以。
3、若两个变量之间是用空格隔开,那空格数至少等于格式控制
中所打的数,可多不可少。
4、%c声明的输入字符,空格和转义字符都是有效的字符,都可以原样输入。
(所以要注意如果是%c的,要避免用这些字符来做分隔的标志)
5、若输入的是数值数据类的,遇到空格、回车、Tab键或非法字符(不属于数值的字符),
会被认为该数据输入结束的标志位。

(2)getchar
(一个字符的输入专用,即char专用)
格式:getchar()【没有参数】
作用:从键盘中获取一个字符

注意:使用getchar()时,有多少个就连续输入多少个字符,输入完才按回车键。
(因为输入时,并不是在键盘上按一个字符,然后该字符就马上到计算机中的,而是
先存进去键盘缓冲器中,然后一按回车才会把输入的东西传进计算机中)。

getchar()的正确示范,如下图要打印BOY三个字
在这里插入图片描述
getchar()的错误示范,如下图要打印BOY三个字
在这里插入图片描述

结果分析:因为三个getchar(),所以只能取三个字符,每输入一个,按一次回车,
则第一次的回车就会被第二个getchar()所捕获,所以无法输入 Y 了。

(3)gets()
函数原型:char *gets(char *str);
这个函数很简单,只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。
作用:是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。
使用示例:

//  数组形式:
# include <stdio.h>
int main(void)
{
    char str[20] ;  
    printf("请输入字符串:");
    gets(str);
    printf("%s\n", str);
    return 0;
}


// 指针形式
# include <stdio.h>
int main(void)
{
    char str[30];
    char *string = str;  //一定要先将指针变量初始化
    printf("请输入字符串:");
    gets(string);  //也可以写成gets(str);
    printf("%s\n", string);  //输出参数是已经定义好的“指针变量名”
    return 0;
}

gets()与scanf()的区别
1、gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。也就是说:gets(str);完全可以取代:scanf("%s", string);
2、使用 gets() 时,系统会将最后的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。如果是 scanf,那么通过键盘给 变量赋值前就必须先使用 getchar() 清空缓冲区。

5、输出:printf(格式输出)、putchar(输出字符)、puts(输出字符串)

(1)printf
输出格式:printf(“格式控制”,输出表列)如:printf("%d ,%c",i,c);

格式控制:由 “ 格式声明 ” 与 “ 普通字符 ” 两个组成 。(与 scanf 的一样。)
输出表列:需要输出的数据。(输出表列中一个变量名或某个值对应一个格式控制符,位置顺序
一一对应)。

(2)putchar
(一个字符的输出专用,即char专用)
格式:putchar(c)【c:是需要输出的字符变量c,可以是一个char类型的变量名或是单引号引住的字符】
如:putchar(’/n’); 或者是
char a=‘b’;
putchar(a);

注意:字符类型也属于整形,因此可以把一个int型的变量通过ASCII码来输出对应的字符。
也可以输出转义字符。

(3)puts( )
函数原型:int puts(const char *s);
只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 ‘\0’ 也就是字符串结束标志符才会停止。

puts()与printf 的区别
在这里插入图片描述
可见使用 puts() 输出更简洁、更方便。而且使用 puts() 函数连换行符 ‘\n’ 都省了,使用 puts() 显示字符串时,系统会自动在其后添加一个换行符。

但是 puts() 和 printf() 相比也有一个小小的缺陷,就是如果 puts() 后面的参数是字符指针变量或字符数组,那么括号中除了字符指针变量名或字符数组名之外什么都不能写。
比如 printf() 可以这样写:
printf(“输出结果是:%s\n”, str);
而 puts() 就不能使用如下写法:
puts(输出结果是:str);
因此,puts() 虽然简单、方便,但也仅限于输出字符串,功能还是没有 printf() 强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值