首页 > 其他分享 >C语言学习笔记1

C语言学习笔记1

时间:2023-06-19 11:45:47浏览次数:34  
标签:语句 变量 int 笔记 C语言 学习 循环 声明 函数

现在开始学习C语言,希望收获满满!

C语言注释

第一种:
以//开始的单行注释。这种注释可以独占一行,也可以代码的右侧空白处。
第二种:
以/*开始,以*/结束的块式注释。这种注释可以包含多行内容,可以独占一行,也可以包含多行。
不支持嵌套使用,以/*开始,只要遇到*/就立刻结束。

提高程序可读性的技巧

选择有意义的函数名
写注释
在函数中用空行分隔概念上的多个部分
每条语句各占一行

变量/常量

变量

变量的作用:给一段指定的内存空间起名,方便操作这段内存
语法: 数据类型 变量名 = 初始值;
eg:  int a = 1;

常量

常量的作用:用于记录程序中不可更改的数据
c++定义常量两种方式
1 #define宏常量: #define 常量名 常量值
	通常在文件的上方,表示一个常量
2 const修饰的变量 const 数据类型 常量名 = 常量值
	通常在变量定义前加关键字const,修饰该变量为常量,不可修改 
	常变量无法构建数组

标识符命名规则

作用:c++规定给标识符(变量,常量)命名时,有一套自己的规则(见名知意)
1由字母,数字,下划线(_),美元符$组成
2不能以数字开头
3不能是关键字
4区分大小写

sizeof关键字

作用:利用sizeof关键字可以统计数据类型所占内存大小(单位字节)
语法: sizeof (数据类型 或者 变量);
数组元素个数=sizeof(arr)/sizeof(arr[0])

计算机单位

计算机中的存储单位主要有以下这些,从小到大排序如下:

1.	Bit:二进制位,是计算机的最小存储单位,只能存储0或1。
2.	Byte:字节,等于8位二进制数,是计算机中最常用的基本存储单元。
3.	Kilobyte (KB):千字节,等于1024字节。
4.	Megabyte (MB):兆字节,等于1024千字节。
5.	Gigabyte (GB):吉字节,等于1024兆字节。
6.	Terabyte (TB):太字节,等于1024吉字节。
7.	Petabyte (PB):拍字节,等于1024太字节。
8.	Exabyte (EB):艾字节,等于1024拍字节。
9.	Zettabyte (ZB):泽字节,等于1024艾字节。
10.	Yottabyte (YB):尧字节,等于1024泽字节。

这里的单位都是基于2的乘方的,这种方法称为二进制记数法,特别适用于计算机科学。但请注意,在某些情况下,如硬盘存储、网络带宽等,人们常常采用十进制记数法,如1KB等于1000B,1MB等于1000KB等,这种情况下记得要区分清楚。

字节(Byte)是计算机中最基本的数据单位之一,常用来计量存储空间的大小或数据量。一个字节由8个比特(Bit)组成,每个比特能够存储一个二进制值,即0或1。

比特(Bit)是二进制数字的最小单位,全名是”Binary Digit”,即二进制位。比特的值只能为0或1。比特是计算机数据存储的最基本单位。

字节和比特之间的关系很简单,即1字节(Byte)等于8比特(Bit)。字节是基于比特的更大一种数据单位,能够存储更多的信息。例如,一个ASCII字符(如字母或数字)通常可以用一个字节来表示。

一个比特(Bit)只能存储一个二进制的值,这个值要么是0,要么是1。所以说,一个比特里只能有一个0或一个1。

如果你想知道两个比特的所有可能的组合,那就有四种可能:00, 01, 10, 11。每增加一个比特,可能的组合数量就会翻倍。例如,三个比特有8种可能的组合:000, 001, 010, 011, 100, 101, 110, 111。

数据类型

C++规定在创建一个变量或常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。

类型 字节数 取值范围
char 1 -128~127
short 2 -32768~32767
int 4 -2147483648~2147483647
long 4 -2147483648~2147483647
long long 8 -2的63次~2的63次-1
float 4 统计7位有效数字
double 8 统计15-16位有效数字
long double 16

科学计数法

float f1 =3e2	//3*10^2
float f2 =3e-2	//3*0.1^2

字符串型

作用:用于表示一串字符
C语言风格字符串
格式:	char 变量名[] = "字符串值"
eg: char str1[] = "hello world";

C++风格字符串
格式: string 变量名 = "字符串值"
eg: string name = "Tom";
文件开头加入一个头文件: #include <string>

bool类型

boolean(布尔)类型有两个值:false(本质是0)和true(本质是1),用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。bool类型占1个字节大小。

简单代码示例

注意:在程序中要用到标准函数库中的输入输出函数,就要加#include <stdio.h>

求两个整数之和

在Visual Studio中会有一些库函数会不安全,报错。解决方法,在程序首行加入:#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h> //编译的预处理指令(标准输入输出函数)standard intput&output(.h)是头文件(header file)
int main()         //定义主函数--程序的入口(main函数有且只有一个)int表示main函数调用返回一个整型值
{                  //函数开始
    int a,b,sum;   //程序声明部分,定义a,b,sum为整型变量
    a=12;          //对a赋值
    b=12;          //对b赋值
    sum = a+b;     //进行a+b运算
    printf("sum=%d\n" ,sum); //输出结果,%d表示用十进制整数形式输出,%d相当于是一个占位符
    return 0;      //使函数返回值为0
}                  //函数结束

键盘输入两个数进行相加

#include <stdio.h>
int main()
{
    //计算两个数相加
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    //C语言语法规定,变量要定义在当前代码的最前面
    //输入数据:使用输入函数scanf
    scanf("%d%d",&num1,&num2); //&是取地址符号
    sum = num1+num2;
    printf("sum=%d\n",sum); //"sum=%d\n",sum=直接打印(可省略),%d是指定类型必须有
    return 0;
}

用一个函数求两个整数中的较大者,打印输出。

#include <stdio.h>    //编译的预处理指令(标准输入输出函数)
int main()			  //定义主函数--程序的入口
{					 //主函数体开始
    int max(int x,int y);	//对被调用函数max的声明
    int a, b,c;				//定义变量a,b,c
    scanf("%d,%d",&a,&b);   //输入变量a,b的值
    c=max(a,b);				//调用max函数将得到的值赋给c,()-->函数调用操作符
    printf("max number=%d\n",c);  //输出c的值
    return 0;				//返回函数值为0
}							//主体函数结束

int max(int x,int y) //定义一个max函数,函数值为整型,形式参数x,y为整型    
{
    int z =0;   //max函数中的声明部分,定义本函数中用到的变量z为整型
    if(x>y)z=x; //若x>y成立,将x的值赋值给变量z
    else z=y;   //否则,将y的值赋值给变量z
    return(z);  //将z的值作为max函数值,返回到调用max函数的位置
}

结构体

#include <stdio.h>
#include <string.h>
struct Book
{
    char name[20];
    short price;
};

int main()
{   //利用结构体类型创建一个该类型的结构体变量
    struct Book b1 = {"C程序语言",55};
    printf("书名为:%s\n",b1.name);
    printf("价格为:%d元\n",b1.price);
    //更改书名价格
    strcpy(b1.name,"C++");	//这是数组,利用库函数string copy字符串拷贝
    b1.price = 15;	//变量可以直接改
    //利用指针打印出书名价格
    struct Book *pd = &b1;
    printf("书名为:%s\n",(*pd).name);
    printf("价格为:%d元\n",(*pd).price);
    //简化版
    printf("书名为:%s\n",pd->name);
    printf("价格为:%d元\n",pd->price);
    //区别
    //. 结构体变量.成员
    //- 结构体指针->成员
    return 0;
    
}

转义字符及其释义

转义字符 释义 输出结果
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符 输出反斜线字符
\' 表示单引号 输出单引号字符
\" 表示双引号 输出双引号字符
? 表示问号,在书写多个问号时使用防止它们被解析成三字母词 输出问号字符
\a 表示警告或响铃 产生声音或视觉信号
\b 表示退格符 将光标当前位置后退一个字符(前进意思)
\f 表示换页(进纸符) 将光标当前位置移到下一页的开头
\n 表示换行 将光标当前位置移到下一行的开头
\r 表示回车 将光标当前位置移到本行的开头
\t 表示水平制表符(Tab) 将当前光标位置移到下一个Tab位置
\v 表示垂直制表符 将当前光标位置移到下一个垂直制表对齐点
\0 表示空字符 没有任何操作
\ddd 表示一个1-3位八进制的数字,dd代表具体数字,如\311(八进制范围0-7) 与八进制码对应的字符
\xdd 表是一个两位十六进制数,dd代表具体数字,如\x12(十六进制范围0-15) 与十六进制码对应的字符

例题

数一数下面输出多少个字符

printf("%d\n",strlen("c:\test\32\test.c"));

//答案:13个
//"\32"代表两个八进制数字(\dd)
//32作为八进制代表的那个十进制数字,作为ASCII码值对应的字符
//32转十进制 3*8的一次幂+2*8的零次幂=26,在ASCII码表对应箭头字符

字符串结束的标志:\0

字符串"abcd"底层为"abcd\0"
'\0' 转义字符 在ASCII码表对应值为0
0    数字0
'0'  字符0   在ASCII码表对应值为48

源码,反码和补码

在计算机科学中,原码、反码和补码都是二进制数字系统中表示有符号数(即正数和负数)的方式。在C语言中,这些概念常常用于位操作。下面是这些概念的基本解释:

原码:
原码是最直观的二进制编码方式,即正数的最高位(符号位)是0,负数的最高位(符号位)是1,其余位(数值位)表示数值的绝对值。

例如,+7的8位原码是00000111,-7的8位原码是10000111。

反码:
正数的反码与其原码相同,负数的反码是符号位不变,数值位取反。

例如,+7的8位反码还是00000111,而-7的8位反码是11111000。

补码:
正数的补码与其原码相同,负数的补码是其反码加1。

例如,+7的8位补码仍然是00000111,-7的8位补码是11111001。

计算机通常使用补码来表示和处理有符号数。因为在补码表示法下,减法可以转换为加法,大大简化了计算机的运算电路。也就是说,计算机中的所有有符号整数运算都是以补码形式进行的。

目标代码文件、可执行文件和库

C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包
含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来
完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他
代码合并,生成可执行文件。

链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码
这 3 部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序
中要用到的库函数代码提取出来。

简而言之,目标文件和可执行文件都由机器语言指令组成的。然而,目
标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中
还包含你编写的程序中使用的库函数和启动代码的机器代码。

编译器和链接器

常见关键字

关键字	说明
auto	声明自动变量
short	声明短整型变量或函数
int	声明整型变量或函数
long	声明长整型变量或函数
float	声明浮点型变量或函数
double	声明双精度变量或函数
char	声明字符型变量或函数
struct	声明结构体变量或函数
union	声明共用数据类型
enum	声明枚举类型
typedef	用以给数据类型取别名
const	声明只读变量
unsigned	声明无符号类型变量或函数
signed	声明有符号类型变量或函数
extern	声明变量是在其他文件正声明
register	声明寄存器变量
static	声明静态变量
volatile	说明变量在程序执行中可被隐含地改变
void	声明函数无返回值或无参数,声明无类型指针
if	条件语句
else	条件语句否定分支(与 if 连用)
switch	用于开关语句
case	开关语句分支
for	一种循环语句
do	循环语句的循环体
while	循环语句的循环条件
goto	无条件跳转语句
continue	结束当前循环,开始下一轮循环
break	跳出当前循环
default	开关语句中的“其他”分支
sizeof	计算数据类型长度
return	子程序返回语句(可以带参数,也可不带参数)循环条件

一、C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。 
 
1 数据类型关键字(12个):

(1) char :声明字符型变量或函数 
(2) double :声明双精度变量或函数 
(3) enum :声明枚举类型 
(4) float:声明浮点型变量或函数 
(5) int: 声明整型变量或函数 
(6) long :声明长整型变量或函数 
(7) short :声明短整型变量或函数 
(8) signed:声明有符号类型变量或函数 
(9) struct:声明结构体变量或函数 
(10) union:声明共用体(联合)数据类型 
(11) unsigned:声明无符号类型变量或函数 
(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) 
 
2控制语句关键字(12个):

A循环语句 
(1) for:一种循环语句(可意会不可言传) 
(2) do :循环语句的循环体 
(3) while :循环语句的循环条件 
(4) break:跳出当前循环 
(5) continue:结束当前循环,开始下一轮循环 
B条件语句 
(1)if: 条件语句 
(2)else :条件语句否定分支(与 if 连用) 
(3)goto:无条件跳转语句 
C开关语句 
(1)switch :用于开关语句 
(2)case:开关语句分支 
(3)default:开关语句中的“其他”分支 
D返回语句
return :子程序返回语句(可以带参数,也看不带参数) 
 
3 存储类型关键字(4个) 

(1)auto :声明自动变量 一般不使用 
(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量) 
(3)register:声明寄存器变量 
(4)static :声明静态变量 

4 其它关键字(4个): 

(1)const :声明只读变量 
(2)sizeof:计算数据类型长度 
(3)typedef:用以给数据类型取别名(当然还有其他作用 
(4)volatile:说明变量在程序执行中可被隐含地改变


二、C语言中的9中控制语句

goto语句:无条件转向; 
if语句:判断语句; 
while循环语句; 
do-while语句:先执行循环体,然后判断循环条件是否成立. 之后继续循环; 
for语句:循环,可替代while语句; 只是用法不同; 
break语句跳出本层的循环;(只跳出包含此语句的循环) 
continue语句:继续(一般放到循环语句里,不在执行它下面的语句,直接跳到判断语句例:for语句,就直接跳到第二个分号处,while语句,就直接跳到while()的括号里; 
switch语句:多相选择; 
return语句:返回;

三目运算符

作用:通过简单的运算符实现简单的判断
语法:表达式1 ? 表达式2 : 表达式3
解释: 
如果表达式1的值为真,执行表达式2,并返回表达式2的结果
如果表达式1的值为假,执行表达式3,并返回表达式3的结果
C++中三目运算符返回的是变量,可以继续赋值。
eg: (a>b?a:b) = 100;

选择结构(分支语句)

C语言是一门结构化的程序设计语言

顺序结构

选择结构(if,switch)

循环结构(while,for,do while)

if语句的第一种格式

if(关系表达式)
	语句体;

执行流程

1首先计算关系表达式的值
2如果关系表达式的值为true就执行语句体
3如果关系表达式的值为false就不执行语句体
4继续执行后面的其他语句

注意:

1大括号的开头可以另起一行书写,但是建议写在第一行的末尾
2在语句体中,如果只有一句代码,大括号可以省略不写
3如果对一个布尔类型的变量进行判断,不要用==号

if语句的第二种格式

if(关系表达式)
	语句体1;
else
	语句体2;

执行流程

1首先计算关系表达式的值
2如果关系表达式的值为true就执行语句体1
3如果关系表达式的值为false就执行语句体2
4继续执行后面的其他语句

if语句的第三种格式

if(关系表达式1)
	语句体1;
else if(关系表达式2)
	语句体2;

	...
	else
		语句体n+1;
	

执行流程

1首先计算关系表达式1的值
2如果为true就执行语句体1;如果为false就计算关系表达式2的值
3如果为true就执行语句体2;如果为false就计算关系表达式3的值
4...
5如果所以关系表达式结果都为false,就执行语句体n+1.

例题

#include <stdio.h>
int main()
{
    int a=0;
    int b=2;
    if(a==1)
        if(b==2)
            printf("hehe\n");
    else 
        printf("haha\n");
        return 0;
}

结果什么都不打印,因为else就近原则,匹配到离他最近的if分支。当然如果在第一个if语句后面·加一个大括号,就可以打印haha了。

switch语句

switch(表达式){
	case 值1:
		语句体1;
		break;
	case 值2:
		语句体2;
		break;
	...
	default:
		语句体n+1;
		break;
}

执行流程

1首先计算表达式的值
2依次和case后面的值进行比较,如果有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
3如果所有的case后面的值和表达式的值都不匹配,就会执行default里面的语句体,然后结束整个switch语句。

格式说明

1表达式:(将要匹配的值)取值为byte,short,int,char.JDK5以后可以是枚举,JDK7以后可以是String。
2case:后面跟的是要和表达式进行比较的值(被匹配的值)。
3break:表示中断,结束的意思,用来结束switch语句。
4default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。
5case后面的值只能是字面量,不能是变量
6case给出的值不允许重复

循环结构

for循环

格式

for(初始化语句;条件判断语句;条件控制语句){
	循环体语句;
}

执行流程

1执行初始化语句
2执行条件判断语句,看其结果是true还是false
	如果是false,循环结束
	如果是true,执行循环体语句
3执行条件控制语句
4回到2继续执行条件判断语句

注意

1求和的变量不能定义在循环的里面,因为变量只在所属的打括号中有效
2如果我们把变量定义在循环的里面,那么当前变量只能在本次循环中有效。
当本次循环结束之后,变量就会从内存中消失
第二次循环开始的时候,又会重新定义一个新的变量

不可在for循环体内修改循环变量,防止for循环失去控制。

while循环

格式

初始化语句;
while(条件判断语句){
	循环体语句;
	条件控制语句;
}

执行流程

1执行初始化语句
2执行条件判断语句,看其结果是true还是false
	如果是false,循环结束
	如果是true,执行循环体语句
3执行条件控制语句
4回到2继续执行条件判断语句

continue是终止于本次循环的,也就是本次循环中的continue后面的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
break是直接跳出循环。

for与while的区别

相同点:运行规则都是一样的
区别:
for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到
while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

for和while在用法中的区别

for循环中:知道循环次数或者循环的范围
while循环:不知道循环的次数和范围,只知道循环的结束条件

do...while循环

格式:先执行后判断

初始化语句;
do{
	循环体语句;
	条件控制语句;
}while(条件判断语句)

无限循环

循环一直停不下来。

for(;;){
	System.out.println("学习");
}
while(true){
	System.out.println("学习");
}
do{
	System.out.println("学习");
}while;

注意:无限循环的下面不能再写其他代码了,因为循环永远停不下来,那么下面的代码永远执行不到。

跳转控制语句

1continue:跳过本次循环,继续执行下次循环

2break:结束整个循环

goto语句

c语言中提供了可以随意;滥用的goto语句和标记跳转的符号。

从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

但是在某些场合下goto语句还是用着着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。

这种情况使用break是达不到目的的,他只能从最内层循环退出到上一层循环。

计算机关机程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
    char input[20]={0};
    //shutdown -s -t 60 系统60秒关机程序
    //system() 执行系统命令的
    system("shutdown -s -t 60");    //系统关机命令
    again:
    printf("请注意,你的电脑将在60秒后自动关机,如果输入:我是猪,就取消关机\n请输入:");
    scanf("%s",input);
    if(strcmp(input,"我是猪")==0)   //比较两个字符串strcmp
    {
        system("shutdown -a");     //系统取消关机命令
    }else{
        goto again;                //goto语句跳转
    }
    return 0;
}

标签:语句,变量,int,笔记,C语言,学习,循环,声明,函数
From: https://www.cnblogs.com/zhangyu520/p/17490760.html

相关文章

  • 关于数据治理的读书笔记 - 数据治理路线图规划
    数据治理成熟度评估为企业提供了一个数据治理的切入点,通过发现企业数据治理中存在的问题,找到目前和业界领先企业的差距,绘制出符合企业现状和需求的数据治理路线图。路线图是指描述技术变化步骤或技术相关环节之间逻辑关系的简洁的图形、表格、文字等形式。数据治理路线图则是对企业......
  • 小白学习MySQL - 随机插入测试数据的工具
    我们日常做一些MySQL测试的时候,经常要造数据,通常就写个循环插入数据的存储过程。前两天碰巧看文章说,mysql_random_data_load程序能向MySQL随机插入大量数据,于是了解一下。mysql_random_data_load是个开源的项目,github路径如下,https://github.com/Percona-Lab/mysql_random_data_loa......
  • 大厂技术总监总结的Android Framework开发笔记火了!知乎已1.7k赞!不吃透都对不起他
    为什么要学AndroidFramework?想要成为一名优秀的Android开发,就需要有一个完备的知识体系,AndroidFramework的知识是很重要的一个组成部分,他广泛的应用在各个领域。像掉帧监控,函数插装,慢函数检测,ANR监控,启动监控,都需要对Framework有比较深入的了解。只有这样才能知道怎么去做监......
  • 计组复习笔记
    重点•冯.诺依曼计算机型计算机的五大特点(p1)•计算机系统的分类(SISDSIMDSIMDMIMD)•计算机能够普及的主要原因•异或门在组成原理中的应用•74LS1814位超前进位加法器•码制的转换、BCD码的概念,BCD码运算后需要修正、补码的双符号位表示•计算机中数据的表示范围和......
  • WPF 入门笔记 - 05 - 依赖属性
    如果预计中的不幸没有发生的话,我们就会收获意外的喜悦。--人生的智慧-叔本华WPF属性系统这一部分是中途加的,直接依赖属性有点迷糊......
  • 学习python爬虫需要掌握哪些库?
    Python爬虫是指使用Python编写的程序,用来自动化地获取互联网上的数据。通过爬取网站的HTML内容,并解析和提取所需的数据,可以实现自动化地收集、分析和处理大量的在线数据。学习Python爬虫需要掌握以下几个核心库:Requests:用于发送、BeautifulSoup:用于解析HTML或XML文档,提取结构化数据......
  • Android性能优化知识脑图总结+学习手册文档,超干分享!
    近几年,Android开发技术不断发展,岗位要求不断升高,导致程序员的面试也进一步向更深、更广处延伸,比如原先很少涉及的性能优化,现已成为大厂的高频面试题。熟悉性能优化相关内容,就相当于拿到大厂的敲门砖,更是工作中最能突显价值的金字招牌。但众所周知,想要学习和掌握性能优化,就必须有实......
  • 学习python爬虫需要掌握哪些库?
    Python爬虫是指使用Python编写的程序,用来自动化地获取互联网上的数据。通过爬取网站的HTML内容,并解析和提取所需的数据,可以实现自动化地收集、分析和处理大量的在线数据。学习Python爬虫需要掌握以下几个核心库:Requests:用于发送、BeautifulSoup:用于解析HTML或XML文档,提取结构化......
  • 【人生】技术学习成长之路
     序号技能名称是否完成讲师1Linux基础完成狂神2Java基础完成尚硅谷3Redis基础完成狂神4MySQL基础未完成                     ......
  • pytest框架学习整理
    1.python的测试框架pytest  --有丰富的插件,需掌握编程语言,灵活性强framework --不用掌握编程语言,主要靠关键字驱动,灵活性不强unitest --python自带的框架2.启动和安装pytest2.1安装pytestpipinstallpytest2.2pytest执行测试用例的标......