C语言复习20210726
ps:在上一篇的基础上添加笔记《C语言学习笔记》
哔哩哔哩:https://www.bilibili.com/video/BV1oi4y1g7CF?p=2&spm_id_from=pageDriver
C语言基础
什么是C语言
C语言是人与机器交互的语言,是一门面向过程的计算机编程语言。
C语言主函数main基本构成
//包含头文件stdio.h
//standard input/output 标准输入输出include <stdio.h>
int main(void)//主程序-程序的入口-main函数有且仅有一个
{
//程序操作代码
//函数printf - print function - 打印函数
printf("hello world!\n");
return 0;
}
//int 是整型的意思
//main前面的int表示main函数调用返回一个整型值
数据类型
数据类型数据类型名打印方式数据长度/字节int整型%d4short短整型%d2long长整型%d4long long更长整型%d8char字符类型%c1float单精度浮点型%f4double双精度浮点型%lf8
[*]char 字符数据类型
#include <stdio.h>
int main()
{
char ch = 'A';//申请一个char类型的空间存放‘A’
printf("%c,ch");//打印字符A %c-打印单个字符格式的数据
return 0;
}
[*]int 整型
#include <stdio.h>
int main()
{
int age = 20;
printf("%d",age);//打印整形数据 %d
return 0;
}short短整型=short int
long 长整型=long int
long long更长的整型=long long int
和整型差不多用法只是内存空间的差别
int main()
{
short age = 20;
//long age = 20;
//long long age = 20;
printf("%d",age);//打印整型都是用%d
return 0;
}
[*]float 单精度浮点型
单精度浮点型默认显示小数点后6位小数
int main()
{
float f = 0.5;
printf("%f",f);
}*当用%.nf时,小数点.+数字n就是设置打印数值的小数点后n位,且n值小于数值小数位时,自动四舍五入
int main(void)
{
float f = 5.155;
printf("%.2f\n", f);//%f-打印float
return 0;
}https://blog.51cto.com/u_15308703/C:UserspopcornAppDataRoamingTyporatypora-user-imagesimage-20210721175833675.png
[*]double 双精度浮点型
//与单精度浮点型float的差别就是 double用%lf打印数据,用法相同
int main(void)
{
double f = 5.154;
printf("%.2lf\n",f);
return 0;
}ps:其它不同类型数据的打印方式
%p--以地址的形式打印
%x-- 打印16进制
%s-- 打印字符串
常量、变量
常量--不会变的量,比如圆周率近似值3.14
变量--会变的量,比如年龄、岁数等
变量又分为局部变量、全局变量。
局部变量和全局变量可以同时存在,建议局部变量和全局变量的名字不要相同,容易产生误会,产生bug。如果存在局部变量和全局变量同名的情况,优先使用局部变量。
#include <stdio.h>
int num = 20;//全局变量-定义在代码块之外的变量
int main()
{
int num = 10;//局部变量-定义在代码块内的变量
return 0;
}
[*]变量的使用
变量加 +
//VS2019出现scanf函数用不了时,需要宏定义下面这句
//加在源文件的第一行
//或者把scanf函数改成scanf_s()
//原因是scanf函数没有做空间越界的判断,所以被认为不安全
//scanf是C语言提供的
//scanf_s不是标准C语言提供的,是VS编译器提供的define _CRT_SECURE_NO_WARNINGS 1include <stdio.h>
int main(void)
{
int num1 = 0;
int num2 = 0;
int sum = 0;//C语言语法规定,变量要定义在当前代码块的最前面
scanf("%d%d", &num1, &num2);//&为取地址符
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
[*]变量的作用域和生命周期
*每一对{}大括号就是一个代码块,当变量处于一个{}内时,这个{}大括号就是变量的作用域。
局部变量的作用域是变量所在的局部范围。
全局变量的作用域是整个工程。
int main()
{
//局部变量的作用域
{
int num = 0;
printf("num = %d\n",num);
}
return 0;
}include <stdio.h>
//全局变量的作用域
//1.局部变量的作用域是变量所在的局部范围。
//2.全局变量的作用域是整个工程。
int global = 2021;
void test()
{
printf("test() = %d\d",global);
}
int main()
{
test();
ptintf("%d\n",global);
return 0;
}
<p> <code>`c
//test2.cdefine _CRT_SECURE_NO_WARNINGS 1
int g_val = 2021;
int main()
{
return 0;
}
//test.cdefine _CRT_SECURE_NO_WARNINGSinclude <stdio.h>
int main(void)
{
//为声明的标识符
//声明:在使用外部全局变量时需要在函数内声明该变量
extern int g_val;
printf("g_val = %d\n", g_val);
return 0;
}
[*]生命周期 (跟作用域差不多)
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。(只认大括号里的)
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。
[*]常量=不变的量
[*]字面常量
int main()
{
int num = 4;
3;//字面常量
100;//字面常量
return 0;
}
[*]const修饰的常变量
int main()
{
//const = 常属性
//加了const的变量不可修改
//num是一个具有常数属性的变量
const int num = 6;
printf("%d\n",num);
num = 8;
printf("%d\n",num);
return 0;
}int main()
{
//这里的n是变量不可放入数组
//consts int n = 10;也不可以因为这里加了const的n还是一个变量,只是具有常数属性
int n = 10;
int arr = {0};//数组长度不可定义为变量
}
[*]#define定义的标识符常量
#include <stdio.h>
define NUM 100
int main()
{
int arr = {0};//这里NUM就为100
return 0 ;
}
[*]枚举常量enum
枚举:一一列举
//性别:男、女、..
//三原色:红、蓝、绿
//星期:周一、二、......
enum Sex
{
MALE,//0
FEMALE,//1
SECRET//2
};//枚举常量-是有值的,且默认按顺序为1、2、3、...
enum Color
{
RED,
BLUE,
GREEN
};
int main()
{
//enum Sex s = FEMALE;//通过函数定义了的枚举常量类型是可以改的
enum Color c = BLUE;
c = GREEN;
printf("%d\n",MALE);//0
printf("%d\n",FEMALE);//1
printf("%d\n",SECRET);//2
return 0 ;
}
字符串、转义字符、注释
[*]字符串
“hello world \n”
双引号括起来的即为字符串字面值-简称字符串
注:字符串的结束标志是一个\0的转义字符
int main()
{
char arr1[] = "abc";//"abc"--'a','b','c','\0'
char arr2[] = {'a','b','c',0};//不加结束符\0打印出乱码
printf("%s\n",arr1);
printf("%s\n",arr2);
return 0 ;
}#include <stdio.h>include <string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
char arr3[] = {'a','b','c','\0'};
printf("%d\n",strlen(arr1));//3
printf("%d\n",strlen(arr2));//15,随机值
printf("%d\n",strlen(arr3));//3
return 0;
}ASCII码(百度都有)
[*]转义字符:用\改变某些字符的常规意思
\n -- 把普通字符n的意思变成换行了
int main()
{
printf("c:\test\32\test.c");
//\t -- 水平制表符
//\t 转义字符算一个字符大小
//\32 -- 32是2个八进制数字
//32作为8进制代表的那个十进制数字,作为ASCII码值,对应的字符
//32(8进制) --> 10进制 26 --> 作为ASCII码代表的字符
return 0;
}int main()
{
//当要打印一串“are you ok??”时,得加转义字符\把??单独转义
printf("(are you ok\?\?)\n");
}转义字符(\后加任何东西都算一个字节大小)释义\?在书写连续多个问号时使用,防止他们被解析成三字母词\ '用于表示字符常量‘\ "用于表示一个字符串内部的双引号\\用于表示一个反斜杠,防止它被解释为一个转义序列符\a警告字符,蜂鸣\b退格符\f禁止符\n换行\r回车\t水平制表符\v垂直制表符\dddddd表示1-3个八进制的数字。如:\130 X\xdddd表示2个十六进制数字。如:\x30 0// \xdd
//61(十六进制) --> 97(十进制)'a'
int main()
{
printf("%c\n",'\x61');
return 0 ;
}
[*]注释
[*]代码中有不需要的代码可以直接删除,也可以注释掉
[*]代码中有些代码比较难懂,可以加一下注释文字
比如://注释掉单行代码
/**/ 注释掉多行代码
C语言风格的注释 / xxxxxxxxx /
缺陷:不支持嵌套注释
C++风格的注释/ xxxxxxxx /
可以注释一行也可以注释多行
选择语句
//if语句
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>\n");
scanf("%d",&coding);
if(coding == 1)
{
printf("坚持,你会有好offer!");
}
else
{
printf("放弃,功亏一篑...");
}
return 0 ;}
循环语句
//while语句
int main()
{
int line = 0;
printf("写一行代码 %d\n",line);
while(line<20000)
{
line++;
printf("写满20000行代码%d\n",line);
}
if(line<20000)
{
printf("keep going!");
}
if(line>=20000)
{
printf("successed~");
}
return 0 ;}
函数
函数包括:自定义函数,库函数等等
//自定义函数
int Add(int x,int y)
{
int z ;
z = x+y ;
return z;//返回值z为int整型,所以函数应该是int Add()
}
int main()
{
int num1 = 10;
int num2 = 20;
int sum = 0;
int a = 100;
int b = 200;
//sum = num1 + num2;
sum = Add(num1,num2);
//sum = a+b;
sum = Add(a,b);
printf("sum = %d\n",sum);
return 0 ;
}
数组
int main()
{
//int a = 1;
//int b = 2;
//int c = 3;
//int d = 4;
//int e = 5;
int arr = {1,2,3,4,5,6,7,8,9,10};
//数组下标从0开始,即arr = 1;
char ch;
while(1)
{
printf("%d\n",arr);
i++;
}
return 0 ;}数组内一个元素大小为4字节
int arr[] = {1,2,3,4,5,6};
该数组内有6个元素,即数组大小为24字节
sizeof(arr)=24;
PS:sizeof 和strlen 的用法区别
sizeof 和 strlen 这两个函数都可以用来计算大小,但又存在差别,sizeof计算该量的占用内存的大小,strlen计算字符串的长度。sizeof可以用于计算数组大小、字符串大小,而strlen不能用于计算数组大小。
当这两个函数同时用于计算字符串时,由于sizeof计算字符串时,字符串后会加上结束符\0所以相同的字符数量的字符串,用sizeof计算的会多1。
操作符
[*]算数操作符
[*]移位操作符
<< 左移操作符 : 乘2 >>右移操作符:除2
[*]位操作符
&按位与(×)全1才1
| 按位或 (+)有1就1
^ 按位异或 同0异1
[*]赋值操作符
=
+=
-=
=
/=
&=
|=
^=
单目操作符
!逻辑反操作
-:负值
+:正值(可省略)
&:取地址
sizeof:操作数的类型长度、变量长度(以字节为单位)
~:对一个数的二进制按位取反
--:<u>前置--:先--再赋值</u>、<u>后置--:先赋值再--</u>
++:<u>前置++:先++再使用</u>、<u>后置++:先使用再++(使用==赋值)</u>
//前置++ :先赋值再自增++
//a先赋值给b -- b = 10
//a再自增 -- a = a+1 -- a = 11;
int main()
{
int a = 10;
int b = 0;
b = ++a;
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0 ;
}//后置++ : 先自增再赋值
//a先自增 -- a = a+1 -- a = 11
//a再赋值给b -- b = 11
int main()
{
int a = 10;
int b = 0;
b = a++;
printf("a = %d\n",a);
printf("b = %d\n",b);
return 0 ;
}:间接访问操作符
(类型):强制类型转换
int a = (int)3.14 ;
文档来源:51CTO技术博客https://blog.51cto.com/u_15308703/3190944
页:
[1]