目录
一、常量
C语言的常量通常分为以下几种
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
1.1字面常量
int main() { //字面常量 5;//整型 100; 3.14;//浮点型 'w';//字符型 “abcdef”;//字符串型 }
1.2const修饰的常变量
int num = 100; num = 200; printf("%d", num);//200 const int num2 = 100;//此时num2不可被修改 //使变量具有常量的属性,就为常变量,但编译器认为它还是变量 num2 = 300; printf("%d", num2); return 0; 报错:E0137:表达式必须是可修改的左值
如何验证const修饰的变量具有常量的属性,但依旧是变量呢?
int n = 10; int arr[n] = { 0 }; 报错:C2057:应输入常量表达式
当我用const修饰时:
const int n = 10; int arr[n] = { 0 }; 报错:E0028:表达式必须含有常量值 //可见const修饰n具有常量的属性(不可更改),但编译器认为n依旧是变量
(举个栗子理解一下常变量:中国人拿到了美国国籍,但依旧是中国人)
1.3#define定义的标识符常量
#define M 100 int main() { printf("%d\n", M);//100 //M=200;M是常量,不可被修改 int arr[M] = { 0 };//标识符常量是常量 }
1.4枚举常量
枚举-----一一列举
//血型、性别、三原色等等
enum Color//enum是枚举关键字 { //RED、GREEN、BLUE是枚举类型Color的可能取值,同时也是常量,叫做枚举常量 RED, GREEN, BLUE }; int main() { enum Color c = BLUE;//为c赋值为蓝色 //验证他们是常量 printf("%d\n", RED);//0 printf("%d\n", GREEN);//1 printf("%d\n", BLUE);//2 //编译器默认给他们0、1、2的值,不可被更改 return 0; }
二、字符串+转义字符+注释
2.1字符串
“hello world”
1.由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符 串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
int main() { //当我们存取多个字符时,就需要创建一个数组 char ch1[] = {'a','b','c'};//三个元素 char ch2[] = "abc";//四个元素 //这两个数组有什么区别呢? //%s打印字符串,打印到'\0'才停止 printf("%s",ch1); printf("%s",ch2); return 0; }
编辑编辑
通过上图可以看出:ch2实际上在末尾有'\0'作为字符串的结束标志,隐藏在字符串中看不见。
当我们分别打印ch1和ch2时,打印效果如右图,为什么会出现这样的效果呢?
接下来通过内存画图解释一下:
编辑
在ch1中,打印完a,b,c后根本不知道'\0'在哪里,所以后面会打印随机值,出现了烫烫,遇到'\0'后才停止。
编辑
在ch2中打印完a,b,c后遇到'\0',停止打印。
这时候我们会想:如果我们在ch1后面加一个'\0'呢?
char ch1[]={'a','b','c','\0'};//此时有'\0'了,ch1中就有四个元素 printf("%s",ch1);
我们查看内存后发现:编辑
2.通过上面的注意我们理解一下:在计算字符串长度的时候 \0 是结束标志,不算作字符串 内容。
我们需要通过计算字符串的长度,在C语言中:提供了一个库函数可以计算字符串的长度,strlen()
(string length),他需要包含一个头文件#include<string.h>
#include<string.h> int main() { char ch1[] = {'a','b','c'};//三个元素 char ch2[] = "abc"; int len1 = strlen(ch1); int len2 = strlen(ch2); printf("%d\n", len2); printf("%d\n", len1); return 0; }
计算结果为:len1=随机值。len2=3。为什么len2结果是3呢?
编辑也就是说strlen统计的是'\0'之前的字符的个数。不算'\0'
但是len1的结果是随机值,因为我不知道'\0'的位置在哪里,所以'\0'之前的字符的个数是随机的。
2.2转义字符
2.2.1转义字符含义
首先我们看下面这个例子:
编辑编辑
转义:转变原来的意思
假如我们要在屏幕上打印一个目录: c:\code\test.c
int main() { printf("c:\code\test.c\n"); return 0; }
编辑
我们发现压根就打印不出想要的效果,因为被转义了。
编辑
简单讲几个:
编辑 奇葩的退格符
通常用来考试编辑
举个栗子:编辑
编辑为什么打印的是;呢?八进制(由0~7组成)的073,通过计算为十进制我们知道:在内存中的字符是通过二进制是不好存储的,我们就对符号编个值,也就是ASCII编码。通过对应ASICII我们发现59的ASCII码值对应的字符是;
编辑 打印结果是:F
通过计算得:70对应的是F
编辑
编辑
2.2.2 笔试题
//程序输出什么? //求字符串长度: #include <stdio.h> int main() { printf("%d\n", strlen("abcdef"));//6 // \62被解析成一个转义字符 printf("%d\n", strlen("c:\test\628\test.c")); return 0; }
请问:下面那个结果是几呢?
结果是:14,转义字符占一个字符的长度。(\t,\62,\t)
为什么不是13呢?因为\ddd是八进制数,范围是0~7,所以不是\628
2.2.3区别
接下来区别一下:
数字:0,字符:'0'的本质是对应ASCLII的48,转义字符:'\0'的本质是0
三、注释
- 代码中有不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
int main() { //定义一个整型变量a,给a赋值10 int a = 20; return 0; }
注释风格:
- C语言风格的注释 /*xxxxxx*/。缺陷:不能嵌套注释
- C++风格的注释 //xxxxxxxx。可以注释一行也可以注释多行
例如:
编辑C语言注释风格下,从/*开始,在函数内部已经出现/*,*/,但是当第一个/*遇到*/就会注释停止,所以会发生如图情况,导致后面内容无法被注释掉。缺陷是:不能嵌套注释
四、选择语句
#include <stdio.h> int main() { int coding = 0; printf("你会去敲代码吗?(选择1 or 0):>"); scanf("%d", &coding); if(coding == 1) { prinf("坚持"); } else { printf("放弃"); } return 0; }
五、循环语句
- while语句
- for语句
- do ... while语句
#include <stdio.h> int main() { printf("努力学习\n"); int line = 0; while(line<=20000) { line++; printf("我要继续努力敲代码\n"); } if(line>20000) printf("好offer\n"); else pirntf("天天编程"); return 0; }
六、函数
#include <stdio.h> 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; } 上述代码,写成函数如下: #include <stdio.h> int Add(int x, int y) { int z = x + y; return z; } int main() { int num1 = 0; int num2 = 0; int sum = 0; printf("输入两个操作数:>"); scanf("%d %d", &num1, &num2); sum = Add(num1, num2); printf("sum = %d\n", sum); return 0; }
函数的特点就是简化代码,代码复用。
七、数组
7.1 数组定义
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
7.2 数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
int arr[10] = {0}; //如果数组10个元素,下标的范围是0-9
编辑
7.3 数组的使用
#include <stdio.h> int main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
编辑
int main() { //若执行小数除法,除号左右两端至少有一个是小数 printf("%d\n", 7 / 2); printf("%lf\n", 7 / 2); printf("%lf\n", 7.0 / 2); /*3 0.000000 3.500000*/ int arr[10]; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(arr[0])); //数组元素个数的计算方法: int sz = sizeof(arr) / sizeof(arr[0]); printf("%d\n", sz); char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; printf("%d\n", strlen(arr1)); printf("%d\n", strlen(arr2)); printf("%d\n", sizeof(arr1)); printf("%d\n", sizeof(arr2)); /* 3 15 4 3 */ //strlen是库函数 //strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数 //sizeof是操作符 //sizeof只关注占据了多大的内存空间,不关注内存中存放的数据 //size返回值的单位是字节 }
strlen和sizeof的区别
strlen是库函数
strlen是求字符串长度的,关注的是字符串中是否有\0,统计\0之前出现的字符个数
sizeof是操作符
sizeof只关注占据了多大的内存空间,不关注内存中存放的数据
size返回值的单位是字节



























































