5. 字符串
定义:类似于 “hello” 这种被双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注意:字符串是以’\0’这个转义字符结尾的。我们来看下面的示例代码:
int main() { char arr1[] = { 'a','b','c' };//将'a' 'b' 'c' 这三个字符存放在arr1数组中 char arr2[] = { "abc" };//将"abc"这个字符串存放于arr2数组中 printf("%s\n", arr1);//打印出abc和一堆乱码 printf("%s\n", arr2);//正常打印abc return 0; }
上述代码第6行在abc之后为何会出现乱码的情况呢?
因为字符串是以’\0’这个转义字符结尾,并且以’\0’作为结束标志,arr1存放的一个一个的字符,并没有将’\0’这个结束标志加在末尾,而arr2存放的字符串,自带’\0’,所以当printf函数打印字符串时,遇到’\0’就停止打印,arr2正常打印,打印arr1时会一直向后打印,直到遇到’\0’才停止,所以会出现乱码的情况。
怎么才能让arr1正常打印呢?我们只需要在arr1这个数组的末尾主动添加一个’\0’即可。
int main() { char arr1[] = { 'a','b','c' ,'\0'}; char arr2[] = { "abc" }; printf("%s\n", arr1); printf("%s\n", arr2); return 0; }
我们看下面一个例子:
#include<stdio.h> #include<string.h>//使用strlen函数要引用头文件 int main() { char arr1[] = { 'a','b','c' }; char arr2[] = { "abc" }; //strlen用于计算字符串长度 printf("%d\n", strlen(arr1));//打印一个大于3的随机数 printf("%d\n", strlen(arr2));//打印3 return 0; }
第8行为何会打印一个随机数呢?其实这里更加印证了字符串以’\0’作为结束标志这个知识点,不过’\0’本身只是一个结束标志,不会被算作字符串的内容。
6 转义字符
当我们想通过printf函数打印 c:\code\test.c 这样一个文件目录时,我们试试下面这个方法:
int main() { printf("c:\code\test.c"); return 0; }
却打印出了这个内容
显然,不是我们想要的,之所以出现这种情况,是因为这里的 ‘\t’ 被解释成为了其他的意义,也就是说,这里的t被转义了。所以,这里的 ‘\t’ 就是一个转义字符。
定义:在字符集中,以一个反斜杠 \ 开头,后面跟一个特定字符的形式被称为转义字符(又称:反斜杠字符),常见的转义字符大家可以去找找,也不用全部都记住,了解就可以。
这里我们重点讲解两个转义字符
- \ddd d d d表示1~3个八进制的数字。 如: \130 表示字符X
- \xdd d d表示2个十六进制数字。 如: \x30 表示字符0
看下边一段代码:
int main() { printf("%c\n", '\130');//打印X printf("%c", '\x30');//打印0 return 0; }
这里打印出了X和0的原因是:我们日常生活中的每个字符都无法直接放入到内存之中,所以人们为了方便表示每个字符,就给每个字符设计一个编号,将常用的字符统计起来,就构成了ASCLL码表。
代码分析:我们将 ‘\130’ 转为10进制就是88,再去ASCLL码表中找到对应的字符就是X,因为是以%c的格式打印,所以就打印X这个字符,若是%d,则打印88。 ‘\x30’ 转为10进制就是48,对应字符0,最后将0打印出来。
注意:
- ‘\ddd’ 这里的d代表的是八进制数,只能是0-7的数字。
- ‘\xdd’ 这里的d代表的是十六进制数,只能是0-f。
7 注释
注释的分类:
- /*xxxxxx*/ 这种注释无论中间有多少行代码,都会被注释掉,但是不能嵌套注释。
- //xxxxxxxx 这种只能注释一行代码
注释的作用:
- 代码中有不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
- 被注释掉的内容是不会被编译器编译的,编译器在编译时会将这部分内容忽视掉
8 函数
当我们想要完成两个数的相加时,我们可以用下面这段代码:
int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("sum = %d\n", sum); return 0; }
而假如我们有很多组数据等着我们相加,我们就得每一次都使用这段代码,这样显得过于冗杂,对此,我们可以将两个数相加这种功能封装起来,组成一个函数,一般而言,一个函数对应完成一种功能。
我们将上面的代码改进一下:
//定义了一个Add函数 int Add(int x, int y) { int z = x + y; return z; } int main() { int a = 0; int b = 0; scanf("%d %d", &a, &b); int sum = Add(a, b);//调用Add函数 printf("%d", sum); return 0; }
这段代码不理解没关系,后期会讲解函数的相关部分。
9 数组
定义:数组就是一组相同类型元素的集合。
//数组的定义方式 int arr[3] = {1,2,3};//定义了能存放三个元素的整型数组,
数组元素的访问:
int main() { int arr[3] = { 1,2,3 }; //分别访问数组的三个元素 printf("%d\n", arr[0]); printf("%d\n", arr[1]); printf("%d\n", arr[2]); return 0; }
注意:数组中的元素是连续存储的,并且数组的下标是从0开始的,数组的最后的一个元素的下标就是元素个数-1,
10 操作符
操作符的分类:
- 算术操作符:+ - * / %
- 移位操作符: >> <<
- 位操作符:& ^ |
- 赋值操作符:= += -= *= /= &= ^= |= >>= <<=
- 单目操作符:
1: !(逻辑反操作)
C语言中,0表示假,非0表示真,我们来看下面一段示例代码:
int main() { printf("%d", 1 > 2);//在屏幕上打印0 return 0; }
上述的代码的原因是因为:1>2这个条件的结果是假,所以最后用0表示,最终就会打印0.
那当我们在1>2之前加一个!会怎样呢?
int main() { printf("%d",! (1 > 2));//打印1 return 0; }
!会将表达式的逻辑值进行取反操作,只要是一个非0的数,经过这个!的操作,就会变成0,反之,表达式为0的经过!的操作,就会变成0。
2:- (负值) +(正值)
3:&(取地址符)
4:sizeof ( 操作数的类型长度,以字节为单位) ,有关sizeof,我们来看下边一段示例代码:
int main() { int a = 10; printf("%d", sizeof(a));//4 printf("%d", sizeof(int));//4 //printf("%d", sizeof int); 报错 return 0; }
注意:用sizeof操作符时,当操作对象是关键字时括号不可以省略,但操作对象是变量时就可以省略,由此可见,sizeof并不总是需要括号的,所以,更加印证了sizeof并不是一个函数,因为函数的括号是不可以省略的。
5:~ ( 对一个数的二进制按位取反)
6: – 前置、后置–
7:++ 前置、后置++
关于前置和后置的++和–,我们看下面一段代码:
int main() { int a = 10; int b = a++; printf("%d %d\n", a, b);//11 10 b = ++a; printf("%d %d", a, b);//12 12 return 0; }
注意:
- 后置++是先运算,再++,所以第4行先将10赋值给b,a再++变成11.
- 前置++是先++,再运算,所以第6行,a先++变成12,再将12赋值给b。
- 前置后置–运算符类似,这里就不作过多解释了。
- 关系操作符:>,>=,<,<=,==,!=.
- 逻辑操作符:&& ||
- 条件操作符: exp1 ? exp2 : exp3
注意:条件表达式的执行逻辑是先判断exp1是否为真,为真则执行exp2,否则执行exp3。我们看下边一段示例代码:
int main() { int a = 2; int b = 3; a > b ? printf("%d", a) : printf("%d", b);//用于判断a b中的较大值。 return 0; }
- 逗号表达式: exp1, exp2, exp3, …expN
注意:逗号表达式会从左至右依次执行,但是整个表达式的结果是最后一个表达式的结果。例如:
int main() { int a = 3; int b = 2; int c = 5; //逗号表达式,是从左向右依次计算的,逗号表达式的结果是最后一个表达式的结果 int d = (a+=3, b=5, c=a+b, c-4); // a=6 b=5 c=11 7 printf("%d\n", d); return 0;
所以这段代码最终打印 7
11.总结
本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!