C语言基础知识

@[TOC]C语言基础知识

初识C语言

数据类型

1、char 字符型(1字节)
2、short 短整型(2字节)
3、int 长整型(4字节)
4、long 长整型(4字节)
(1)、C语言规定long型变量所占内存大于等于int型变量所占内存即可
5、long long 更长的整形(8字节)
6、float 单精度浮点型(4字节)
(1)、在定义float类型变量时应在数值末尾加上f,例如:float a=3.14f;
(2)、float默认保留小数点后6位,最多可以保留6位
7、double 双精度浮点型(8字节)
(1)、在定义double类型变量不用在末尾加f。
(2)、double默认保留小数点后6位,但最多可以保留15位

变量、常量

1、定义

常量:有些值是不会变的,称为常量(如:生日、性别、身份证号码)
变量:有些值会改变,称为变量(如:年龄、体重、薪资)

2、变量的命名原则

(1)、只能由字母(区分大小写)、数字、下划线(_)组成
(2)、不能以数字开头
(3)、长度不能超过63个字符
(4)、变量名不能使用(int、char)等关键字

3、变量作用域和生命周期

(1)、作用域

限定该变量名称的可用性的代码的范围就是该变量的作用域。
局部变量的作用域:变量所在的局部范围
全局变量的作用域:整个工程文件

int main()
{
	{
		int a = 100;
	}
	printf("%d\n", a);//此情况下打印不出来a=100。
	//因为int a=100;只在大括号中有意义,出了大括号他就会被销毁,所以大括号即为作用域。
}
(2)、生命周期

生命周期指的是变量从创建到销毁之间的一个时间段。
局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期:整个程序运行时都属于全局变量的生命周期。

4、变量分类

(1)、局部变量:定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。
(2)、全局变量:在所有函数外部定义的变量称为全局变量,它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。
(3)、当一个.c文件想调用另一个.c文件的全局变量时,需提前使用extern声明该变量。
(4)、全局变量与局部变量同名的情况:

int global = 2020;//全局变量
int main()
{
	int global = 2021;//局部变量
	int local = 2022;//局部变量
	printf("global:%d\n", global);
	printf("local:%d\n", local);
	return 0;
}

在这里插入图片描述
可见在局部变量与全局变量同名时,局部变量优先使用。

5、几种常量的形式

(1)、字面常量:1、2、3.14、‘a’(字符常量)、“abc”(字符串常量)
(2)、const修饰的常变量
①、const修饰的常变量在语法层面限制常变量不能被修改。

int main()
{
	int num = 100;
	const int a = 300;
	printf("%d  %d\n", num,a);
	num = 200;
	//a = 500; const修饰的常变量不能修改,此时编译器会报错
	printf("%d  %d\n", num,a);
	return 0;
}

在这里插入图片描述
②、const修饰的常变量本质上还是变量。

int main()
{
	const int n = 10;
	int arr[n] = { 0 };//无法通过,因为n在编译器看来是变量,只不过被const修饰,从语法层面他不可以被修改,所以n本质上还是变量
	return 0;
}

在这里插入图片描述
(3)、define定义的标识符常量
#define n 100
(4)、枚举常量

enum color
{
	//red,blue,green是枚举类型color的可能取值,是常量,所以叫枚举常量
	red,//0
	blue,//1,有,结尾
	green //2,此处无符号结尾
};//这是一个枚举类型,枚举常量默认从0开始,依次向下递增1
int main()
{
	int arr[n] = { 0 };//此时可以编译通过证明n为常量
	enum color c = blue;
	printf("%d\n", red);
	printf("%d\n", blue);
	printf("%d\n", green);
	printf("%d\n", c);
	//red = 100; 会报错,证明不能修改枚举常量的值
}

在这里插入图片描述

字符串

字符串是由双引号引起来的一串字符,字符串的结尾标志是’\0’,**在计算字符串长度的时候’\0‘是结束标志,不算做字符串的内容。

//字符串,%s是打印字符串,一直到'\0'才停止
//strlen是库函数,需要头文件string.h,作用是计算字符串长度
#include<string.h>
int main()
{
	char arr1[] = { 'a','b','c' };//数组中有三个字符a、b、c
	char arr2[] = "abc";//其实数组中存储了四个字符:a、b、c和转义字符'\0'作为字符串的结束标志
	char arr3[] = { 'a','b','c','\0' };

	char arr4[3] = { 'a','b','c'};//此时数组定义为3个内存空间,注意:定义数组长度只能限制元素个数,但无法限制字符串结束标志

	printf("%s  %d\n", arr1,strlen(arr1));//效果是abc加一堆乱码,因为数组没有结束标志,会一直打印直到'\0'为止    15
	printf("%s  %d\n", arr2,strlen(arr2));//效果是abc															 3
	printf("%s  %d\n", arr3,strlen(arr3));//效果是abc															 3
	printf("%s  %d\n", arr4,strlen(arr4));//效果是abc加一堆乱码,还是因为没有转义字符'\0'						 15
}

在这里插入图片描述

声明和定义的区别

1、定义:定义就是创建一个对象,给它分配内存并取名字(变量名或对象名),还可以指定初值。另外,一个变量或对象在同一个作用域中只能被定义一次,否则编译器会提示重复定义。
2、声明:用于向程序表明变量的类型和名字。告诉编译器这个名字已使用,别的地方不能再用它作为变量名或对象名。另外,声明可以出现多次。
区别:
(1)、定义对象分配了内存,声明没有分配内存。
(2)、定义也是声明,extern声明不是定义(通过使用extern关键字声明而不定义)。
(3)、带有初始化的声明必定是定义。
注意:
(1)、在调用一个变量之前必须有声明,但是如果有了定义就不需要声明了,因为定义也包括了声明,一个局部变量如果只是声明,没赋值,编译器会报错。
(2)、在针对变量的声明或定义中,除非由extern关键字的是声明,否则都是定义。

extern int i; //声明
int i; //定义    

(3)、针对函数时,带有{ }的就是定义,否则就是声明。

extern int max(int a1,int a2);  //声明

转义字符

在这里插入图片描述

  1. '与\”的用法:
int main()
{
	printf("%c\n", 'a');
	//printf("%c\n",''');//这样并不会打印出单引号,编译器会将前两个当成一对儿,第三个则多余,报错
	printf("%c\n", '\'');//此时会输出单引号
	
	printf("%s\n", "abc");//abc为一个字符串
	printf("%s\n", "a");//a也是一个字符串
	//printf("%s\n", """);编译器会报错了,类似于单引号
	printf("%s\n", "\"");//输出一个双引号
	return 0;
}
  1. \b的用法
	printf("abcdef\bgh\n");//输出abcdegh,因为\b是退格符,会退到f那里,打出gh
  1. \?是为了在书写连续多个问号时,防止被解析成为三字母词
int main()
{
	//??) - 三字母词 - 会变成 ], vs不支持这个三字母词,
	//有的支持三字母词的编译器产生的结果是:(are you ok],只需要在连续多个问号的每个问号前加一个\,变成(are you ok\?\?)即可,VS不支持三字母词,所以不需要考虑这个了。
	printf("(are you ok??)");
	return 0;
}
  1. \ddd、\xhh的用法
    (1)、
    \ddd中ddd表示1-3位八进制的数字,比如:\130
    \xhh中hh表示两个十六进制的数字,比如:\x16
    (2)、
    C语言本身支持的三种输入是:
    十进制。比如20,457;
    十六进制,以0x开头。比如0x7a;
    八进制,以0开头。比如05,0237
    所以C语言没有二进制输入,最多可用函数去实现。
    (3)、
int main()
{
	printf("%d   %c\n", '\073', '\073');//八进制的073,对应10进制为59,所对应的符号为;
	printf("%d   %c\n", '\x3b', '\x3b');//x3b为16进制,对应10进制59,对应符号;
	return 0;
}

在这里插入图片描述

注释

  1. /* 与*/属于c语言注释,不能嵌套,从第一个/* 开始直到遇到第一个 * /结束,并不能保证对应的/* 与*/匹配
  2. //是c++中的注释

选择语句

int main()
{
	int input = 0;
	printf("你是否要好好学习(1/0)?");
		scanf("%d", &input);
	if (input == 1)
		printf("好offer");
	else if (input == 0)
		printf("坏offer");
	else
		printf("输入错误!");
	return 0;
}

循环语句

  1. while语句
int main()
{
	int line = 0;
	while (line <= 20000)
	{
		line++;
		printf("我要努力敲代码!");
	}
	if (line > 20000)//if语句是为了保证while循环是在line大于20000条件下结束的,而不是别的突发情况。
		printf("你会有好offer!");
	return 0;
}
  1. for语句
  2. do…while语句

函数

函数的作用是简化代码,代码复用,主要应用于某个功能在文件中被多次调用的时候就可以将其写成一个函数。

//函数
int add(int a, int b)
{
	int c = 0;
	c = a + b;
	return c;
}
int main()
{
	int num1 = 10, num2 = 69;
	int sum = add(num1, num2);
	printf("%d\n", sum);
	return 0;
}

数组

1.定义:一组相同类型元素的集合
2.下标:数组第一个元素下标为0,可以通过下标来访问数组
3.数组的使用:

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9 };
	char ch[5] = { 'a','b','c' };//在未存满时都默认为0
	printf("%s\n", ch);
	return 0;
}

操作符

  1. 算数操作符:+、-、*、/、%
  2. 移位操作符:>>、<<
  3. 位操作符:&、^、 |
  4. 赋值操作符:=、+=、-=、*=、/=、^=、|=、>>=、<<=
  5. 单目操作符:
    在这里插入图片描述
    注1:除号的使用
int main()
{
	int a = 9 / 2;//4
	float b = 9 / 2;//4,运算符两边都是整数时按整数乘除法算,有一方为小数时,即为小数除法
	float c = 9 / 2.0;
	printf("%d %f %f", a, b,c);
	return 0;
}

在这里插入图片描述
注2:~(取反)号的使用:

// ~ 对二进制位按位取反
//数据在内存中存储方式为补码形式
//-1
//原码 10000000 00000000 00000000 00000001 最高位为符号位,1代表负,0代表正
//反码 11111111 11111111 11111111 11111110 符号位不变,其他位按位取反
//补码 11111111 11111111 11111111 11111111 反码的基础上加1即可
//正数的原码、反码、补码都一样
int main()
{
	int a = 0;		   //二进制00000000 00000000 00000000 00000000
	printf("%d\n", ~a);//~a对应二进制 11111111 11111111 11111111 11111111,先减1变成反码,再把除符号位的其他位按位取反,可得到输出值为-1
	return 0;
}

注3:++在前 先自加后使用 ++在后,先使用后自加

int main()
{
	int a = 10, b = 0,c=0;
	b = ++a;//先将a自加后再赋值给b,a也会变,所以b=a+1=11.a=a+1=11
	c = a++;//先将a赋值给c,a再加1。所以c=11,a=12。
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
	return 0;
}
  1. 关系操作符
    在这里插入图片描述
  2. 逻辑操作符
    在这里插入图片描述
    逻辑与(&&):有假则假,全真则真
    逻辑或(||):有真则真,全假则假
  3. 条件操作符
    在这里插入图片描述
//条件操作符(三目操作符)
//exp1?exp2:exp3     exp1成立,exp2计算,整个表达式的结果是exp2计算的值,若exp1不成立,exp3计算
int main()
{
	int a = 5, b = 7, max = 0;
	max = a > b ? a : b;
	printf("%d\n", max);
	return 0;
}

在这里插入图片描述
9. 逗号表达式
(exp1,exp2,exp3…expn)

//逗号表达式,从左到右依次计算,最后一个表达式计算的值即为逗号表达式的值
int main()
{
	int a = 3;
	int b = 4;
	int c = 5;
	int d = (a = b - 2, b = c + 4, c = a - b);
	printf("%d\n", d);
	return 0;
}

在这里插入图片描述
10.下标引用操作符 [ ]

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	printf("%d\n", arr[3]);
	return 0;
}

11.函数调用操作符 () 可以调用0、1、2、3…等多个参数

int main()
{
	printf("hehe\n");//调用一个参数字符串
	printf("%d\n", 100);//调用两个参数字符串和常量
	return 0;
}

12.sizeof也是操作符

//sizeof后边若为变量,则括号可以省略,如sizeof a,因为他是操作符
//但是sizeof int 不支持
//函数后边的括号不可以省略
int main()
{
	int a = 10;
	printf("%d  %d\n", sizeof(int), sizeof a);//均为4,因为a为整型变量
	return 0;
}

//sizeof也可以计算数组长度
int main()
{
	int arr[10] = { 1 };
	printf("%d\n", sizeof(arr));//计算数组长度
	printf("%d\n", sizeof(arr[0]));//计算单个元素长度
	printf("%d\n", sizeof(arr)/sizeof(arr[0]));//计算元素个数
	return 0;
}

常见关键字

define定义常量和宏

指针

结构体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值