目录
一、常量
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返回值的单位是字节