初始时间:大一(上) 10月
更新时间:大一(上) 10月
想了想还是写一下简介吧,我在暑假自学了一点C语言,现在是个大一入门C语言(的弱鸡,所以本文可能会有很多基本知识,还请大家斟酌观看
PS:本文仅供有些C语言基础,想回顾知识点的伙伴阅读
Start!( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)
———————————————————————————————————————
一、斜杠’ / '的用法(一般有4种用法
1.算术,即加减乘除的除号
2.注释,即//
3.命令行或终端(cmd、powershell)的某些操作
4.网址名,如 https://blog.csdn.net
———————————————————————————————————————
二、变量
1.变量名,遵循两个原则(仅允许包含数字、__、字母,且不能由数字开头)
2.函数不能给给变量赋值,例:
int a = max(1,10)//错误
———————————————————————————————————————
三、格式符(列举的都是平时不常见的
格式符 | 作用 |
---|---|
%i | 整型(和%d作用一样) |
%e | 以指数形式输出浮点数 |
%E | 同上 |
%g | 自动选择合适的输出形式 |
%G | 同上 |
%s | 输出字符串,但作用对象是char的数组 |
%p | 输出指针的地址 |
%o | 无符号八进制(无前导0) |
%u | 无符号十进制 |
%x | 无符号十六进制(无前导0X) |
%X | 同上 |
补充:
%s对应的类型是char(*),即字符串,又即char的数组,举例:
char a[] = "123456";
printf("%s",a);//a指向[0]
printf("%s",&a[2]);//&a[2]指向a[2]
output:123456
output:3456
关于%n我也不是很清楚,似乎不是很常用,就不做过多阐述了
打印时也要注意:
float a,b;
scanf("%f,%f",&a,&b);//中间是逗号
printf("%f和%f",a,b);
intput:1.2,2.3//中间是逗号
output:1.2和2.3//正常输出
intput:1.2 2.3//中间是空格
output:1.200000和-107374176.000000//一堆乱码
float a,b;
scanf("%f %f",&a,&b);//中间是空格
printf("%f和%f",a,b);
intput:1.2,2.3//中间是逗号
output:1.200000和-107374176.000000//一堆乱码
intput:1.2 2.3//中间是空格
output:1.2 2.3//正常输出
说明:在scanf中若两个格式符中间是逗号,则打印时一定要在输入时加逗号(英文);若两个格式符中间是空格,则打印时一定要在输入时加空格;按照要求来准没问题
小提示:输入浮点数 .1 就是 0.1 哦~
———————————————————————————————————————
四、宏定义的坑
#define F(n) 2*n
用的时候:F(3+2)
实际情况:10
电脑操作流程是:F(3+2) == 2*3+2 == 10
因为宏定义的做法是直接替换,不会做运算处理(预处理)
———————————————————————————————————————
五、进制
1、补码,只存在于unsigned类型的数中,意义是为了表示符号位;
在二进制中的表达就是八个比特位中最左边的那个数字,称做“补号位”;
如:int 里的十进制 -5 在内存中就是 10000101(0是正数,1是负数)
2、ASCII码,A的二进制ASCII码是01000001,a的二进制ASCII码是01100001,由此看出所有字母大小写的ASCII码(二进制)第5位都是相互的;
结论:大写字母的ASCII码(十进制)+32变小写字母
———————————————————————————————————————
六、运算
表达式 = 运算符 + 操作数
%为求余运算符(注意%只能用于整型)
相当于把求得的值的小数点后面的部分去掉
例:-3%2 == -1
/是普通除号
例:1/3 == 0
例:1.0/3 == 0.33333
例:1/3.0 == 0.33333
编译器原理:
printf("%d\n",1+2.0);
printf("%f",1+2.0);
output:0
output:3.0
电脑操作过程:
都先把1转换成1.0(编译器会将小字节的操作数转换成大字节的操作数)
1.0+2.0 == 3.0 若输出为%d则溢出即变成0,若输出为%f则输出3.0
至于溢出的具体原理我还不清楚(日后补坑)
类型转换:
printf("%d",1+(int)2.0);
output:3
ASCII码的运用:
int a = 2,b = 1;
printf("%d",a/'b');
output:0
因为ASCII码’b’在十进制中相当于98,故2/98 == 0
———————————————————————————————————————
七、逻辑运算符
下面为逻辑运算符关系对应表
且 | 或 |
---|---|
and | or |
与 | 或 |
&& | || |
记住一个口诀:且,有假则假,或,有真则真
优先级:!(非) 大于 && (与) 大于 || (或)
短路原则:因为&& 和 || 都满足从左到右的结和性,所以当他们左右边的数都满足只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值,这称为短路原则
说这么多不如举例:
int a = 1,b = 0;
while(a == 1 && b == 1)
看看电脑的运行过程:
电脑会先判段a == 1为真,&&运算符是且,有假则假,但左边判断为真,仍需判断右边才能知道整个表达式的真假性,下个过程就开始对b == 1进行判断…
PS:C语言不支持(0 <= a <= 10)这种写法,要写(0 <= a && a <= 10)
———————————————————————————————————————
八、四个语句(列举的都是平时不常见的
1、else if语句(适用于判断范围)
if()
{...}
else if()
{...}
else if()
{...}
else
{...}
先执行if语句(若不满足),到else if语句(若满足)则直接打印它的局部程序块(大括号里的内容)打完就直接结束整个if循环;到else if语句(若不满足)则到下一个else if语句…
if()
{...}
else if()
{...}
else if()
{...}
这个if循环没有else语句,可以执行但是缺点是当if语句所有else if语句都不满足时就直接结束整个if循环,并不会打印任何一个局部程序块
2、switch语句(适用于判断离散值)
switch(score/10)//里面接变量或变量表达式
{
case 10: //case后面接常量
case 9:printf("A(最好)\n");break;
case 8:printf("B(优秀)\n");break;
case 7:printf("C(良好)\n");break;
case 6:printf("D(及格)\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E(不及格)\n");break;
default:printf("Error!\n");
}
当变量表达式所表达的量与其中一个case语句中的常量相符时,就执行此case语句后面的语句,并依次下去执行后面所有case语句中的语句,除非遇到break;语句跳出switch语句为止。如果常量表达式的量与所有case语句的常量都不相符,就执行default语句中的语句
3、do while语句(适用于先执行再判断)
int pwd = 7;
do
{
printf("Please guess (0~10):");
scanf("%d",&gs);
}
while(gs!=pwd);
注意whlie后面一定要加分号
4、goto语句(适用跳出多重循环)
while()
{
while()
{
for( ; ; )
{
if()
{
goto temp;//直接跳转到temp语句
}
}
}
}
temp:printf("123");//跳转到这里
goto语句后面也可以接函数
虽然goto语句便于初学者使用,但是在后期结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
告诉大家我的一个理解:
当想用goto语句的时候,想想大家都不推荐使用goto语句,说明goto语句是没必要的,既然没必要用,又说明是自己的语句出了问题,那就试着去用别的(或多个)循环去代替goto语句,去解决这个问题(我就是一直靠这个想法解决了很多问题hh~
———————————————————————————————————————
九、大杂烩(这里的笔记都是混杂的
1、按一下Tab键会向右移8个字节
2、定义char的时候前面记得加 unsinged 或 signed(因为signed %char的范围实在是太小了)
3、定义unsinged long long int,打印时必须用%llu,定义long long int,打印时必须用%lld,其他也同理
4、C语言可以用!0和 i++,而python不能这么用
5、int a 的 a只是用来储存的,并不是用来计算的,其他也同理
int a = 10.2 * 10;
printf("%d", a);
output:102//并不会溢出
6、浮点数四舍五入的方法是:浮点数加0.5再化成整型(int)
7、C语言的叫_Bool,python的布尔类型叫bool;C语言的布尔类型只有0和!0,pyhton的布尔类型只有True和False
8、数组的越界访问:若a[5] = “01234”,访问 a[0] – a[4]都合法,但访问 ’ \0 '或以后的都算越界
9、头文件<math.h>所包含的两个函数的用法
第一个之 fabs()函数是求浮点型绝对值的(整型不行!)
#include <math.h>
...
float number = -1234.0;
printf("%f",fabs(number));
output:1234.000000
第二个之 sqrt()函数是开浮点型根号的(整型不行!)
#include <math.h>
...
float number = 16.0;
printf("%f",sqrt(number));
output:4.000000
———————————————————————————————————————
十、两个运算符
1、逗号运算符(1)
a = 3,5;//相当于a = 3;5;
1、逗号运算符(2)
a = (3,4,5)
output:5
取逗号最右边的值
1、逗号运算符(3)
a = (b = 3,(c = b + 4) + 5)
output:12
虽然括号运算符大于逗号运算符,但是逗号两边是表达式,故只要在逗号表达式中,都应该从左到右依次执行
2、条件运算符
exp1 ? exp2 : exp3 ;
若结果为真则返回exp2,若结果为假则返回exp3
(1 < 3) ? True : False
output:True
———————————————————————————————————————
十一、一维数组
1、定义(直接举例)
int a = {1,2,3};
for (i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
output:12300
float a = {1,2,3};
for (i = 0; i < 5; i++)
{
printf("%f\n", a[i]);
}
output:1.000000
2.000000
3.000000
0.000000
0.000000
char a = {'1','2','3'};
for (i = 0; i < 5; i++)
{
printf("%c", a[i]);
}
output:123
说明整型和浮点型数组后面自动填充0,字符型数组后面自动填充’\0’
2、C99标准下的一维数组(1):定义特定数组元素
int a[10] = {[3] = 3,[5] = 5};
注意:某些编辑器可能不支持此功能~
2、C99标准下的一维数组(2):可变长数组(动态数组)
char a[n+1];
getchar();
for(i = 0;i < n;i++ )
{
scanf("%c",&a[i]);
}
a[n] = '\0';
printf("您输入的数字是:%s",a);
input:1 2 3 4 5
output:1 2 3 4 5
注意:某些编辑器可能不支持此功能~
3、获取数组长度
int a[] = {1,2,3};
printf("%d",sizeof(a)/sizeof(a[0]));
sizeof(a)指 a 整个数组的字节数
sizeof(a[0])指 a[0] 这个元素所占的字节数
4、针对_字符串_数组的头文件<string.h>
头文件<string.h>所包含的函数太多了,所以这里我们只讲
- strlen(求字符串长度
- strcpy(复制字符串
- strncpy(复制字符串(可指定个数
- strcat(连接字符串
- strncat(连接字符串(可指定个数
- strcmp(比较字符串
- strncmp(比较字符串(可指定个数
1、strlen(求字符串长度
char a[] = "1 2 3";
printf("%d", strlen(a));
output:5
计算数组a字符串长度(不包括’\0’)
注意:strlen()的返回值是unsigned int,故(strlen( ) - strlen( ))的值永不为负
2、strcpy(复制字符串
char a[4];
char b[] = "456";
strcpy(a, b);
printf("%s",a);
output:456
a数组的长度一定要长于b数组
3、strncpy(复制字符串(可指定个数
char a[4];
char b[] = "456";
strncpy(a, b, 2);//复制2个字符
a[2] = '\0';//第二个元素赋值为'\0'
printf("%s",a);
output:45
a数组的长度一定要长于b数组,且在第(复制个数)位元素最后加个’\0’
4、strcat(连接字符串
char a[4] = "123";
char b[] = "456";
strcat(a,b);
printf("%s\n", a);
printf("%d",sizeof(a));
output:123456
4
说明a[ ]的数组长度并没有变换,但是打印的字符变多了(?ε=ε=ε=┏(゜ロ゜;)┛
还有不用在末尾加’\0’
5、strncat(连接字符串(可指定个数
char a[4] = "123";
char b[] = "456";
strncat(a,b,2);
printf("%s\n", a);
printf("%d",sizeof(a));
output:12345
4
说明a[ ]的数组长度依然没有变换,打印的字符变多了(emmm…日后补坑
还有不用在末尾加’\0’
6、strcmp(比较字符串
int c;
char a[] = "12347";
char b[] = "12345";
c = strcmp(a,b);
printf("%d",c);
output:1
若比较的两个数组字符串完全相同返回0
若不同,则比较开始不同的地方,若左边字符的ASCII码大返回1,否则返回-1
7、strncmp(比较字符串(可指定个数
int c,d;
char a[] = "12344";
char b[] = "12345";
c = strncmp(a,b,4);
d = strncmp(a,b,5);
printf("%d\n",c);
printf("%d",d);
output:0
-1
若比较的两个数组字符串完全相同返回0
若不同,则第0位元素开始比较一直到指定个数的地方
若左边字符的ASCII码大返回1,否则返回-1
———————————————————————————————————————
十二、二维数组
1、初始化为0或’\0’
对于一维数组:int a[5] ={0} ←←这是整型与浮点型 //这是字符型↓↓
char a[5] = {’\0’} char a[5] = {’’} char a[5] = {0}(因为ASCII码的0表示空字符)
对于二位数组:初始方法和一维数组一样,只是要把a[5]换成a[5][5](即整个数组
2、赋值方法(比较特殊)
one/直观写:
int a[2][3] = {{0,1,2},{3,4,5}}
two/部分写:
int a[2][3] = {{1},{2}}
这样写的结果是各行第一个元素被赋值(a[0][0]、a[1][0])其他都为0
three/指定部分写:
int a[2][3] = {[0][1] = 1,[1][2] = 6}
这是C99特性,有的编辑器可以用,而有的用不了
four/省略写:
int a[][3] = {{0,1,2},{3,4,5}}
只有第一个括号的内容可以省略,在二维数组表示可以省略行
注意:无论是多少维的数组,都只有第一个括号(即一维数组)可以省略
3、打印字符串
char a[3][20] = {"Please","grab attention","CourserLi's Blog"};
printf("%s",a[1]);
output:grab attention
要理解需要明白指针的基本原理
4、获取二位数组长度
int a[][3] = {0,1,2,3,4,5};
printf("%d",sizeof(a)/sizeof(a[0][0]));
sizeof(a)指 a 整个数组的字节数
sizeof(a[0][0])指 a[0][0] 这个元素所占的字节数
5、fgets()函数
提前声明:
下面我将列举fgets()函数的最基础用法,因为此函数水很深,无法全面阐述,这个坑我以后不会在这里补,我可能会专门出一篇关于此函数的文章
用此函数接收 输入字符串 并打印出来
char str[30];
char* string = str;
printf("请输入字符串");
fgets(string, sizeof(string), stdin);
printf("%s", string);
这里涉及到的指针不做讲解(若有兴趣可以看看这篇博客:C语言有关指针的概念)
fgets( , , )的第一个参数是输入字符串的存放位置
fgets( , , )的第二个参数是接收(输入字符串)的个数
fgets( , , )的第三个参数是stdin是标准输入流(键盘)
———————————————————————————————————————
✧(≖ ◡ ≖✿)终于结束了~
这是(萌新笔记)C语言的复习笔记系列的第一篇,今后我也会多出些高质量的笔记,也希望大家多多关注我哟(^U^)ノ~YO
还有,其实我也是刚刚开始使用CSDN博客,所以可能没有那么熟练,在写的过程中可能也有些疏忽,若你们在阅读的过程中发现了什么问题,或者想补充些知识点,也请大家在评论区里面留言斧正,互相交流学习,我不胜感激~
最后再一次感谢大家ヾ( ̄▽ ̄)Bye ~ Bye~