前面我们讲了什么是C语言、第一个C语言程序、数据类型,接下来我们再来学习一点新的东西,同样,知识也是点到为止,对C语言有一个初步的了解。
在我们日常生活中,通常有一些值是不变的(类如:圆周率、性别,身份证号码、血型...等等)
还有一些值是可变的(比如:年龄、体重、薪资)
在C语言中用常量来表示这些不变的值,用变量来表示这些可以改变的值。
数据类型 + 变量名 = 对其进行赋值;
int a = 0; //这里对其赋值0,表示对a进行初始化
//一个人的年龄
int age = 18;
//一个人的身高
float high = 1.75f; //这里要注意:在VS编译器里面小数类型默认是double类型
//在其后面加上f将其改变为float类型
//表示一个字母
char ch = ‘A’;
只能由字母(包括大写和小写)、数字和下划线(_) 组成。
不能以数字开头。
长度不能超过63个字符。
变量名中区分大小写的。
变量名不能使用关键字。(这里的关键字在后文中会有介绍)
注:变量的命名要有实际意义
局部变量
全局变量
局部变量指的是在一个函数内部定义的变量;
全局变量也称做外部变量,指的是函数外部定义的变量,可以被本程序所有对象或者函数引用。
变量要定义在当前代码块的最前面。
#include
int c = 30; //全局变量
int main()
{
int a = 10; //局部变量
int b = 20; //局部变量
printf("a=%d\n", a );
printf("b=%d\n", b );
printf("c=%d\n", c );
return 0;
}
当局部变量和全局变量的名称冲突时,会发生什么呢?
我们用代码来验证一下
#include
int a = 20; //全局变量
int main()
{
int a = 10; //局部变量
printf("a=%d", a);
return 0;
}
当全局变量和局部变量的名称发生冲突时,优先编译局部变量。(当我们给变量命名的时候,尽量不要发生命名冲突的情况)
这里可以看到,当局部变量和全局变量命名发生冲突时,优先编译的是局部变量。
当我们创建一系列的变量时,我们要使用所创建的变量,该怎么使用呢?
在使用之前我们来了解一些新的知识:
(1).输入输出语句:
scanf 函数可用于输入,printf 函数可用于输出
(2).基本语法
scanf ("%d %d", & x, & y);
我们这里假设我们输入的数为整形,所以打印整形需要的是%d,假设我们所要输入的是两个数,后面就跟&x,&y,这里x和y表示所要输入的值,要注意 & 表示取地址的意思,当我们输入一个数,我们要把它存起来,就需要取它的地址进行储存。
我们用代码来演示一下
求两个数的和:
#include
int main()
{
int a = 0;
int b = 0;
int sum = 0;
printf("请输入两个整数\n");
//输入
scanf("%d %d", &a, &b); //这里注意:%d %d,表示在后面输入两个数的时候,中间要用空格隔开
//计算 //如果这里是 %d,%d,则输入两个数的时候中间要加上,
sum = a + b;
//输出
printf("sum=%d", sum);
return 0;
}
这个代码很好的给我们演示了两个数的相加,以及scanf函数的使用
注:在VS这种编译器里面会对scanf函数进行警告,VS会感觉scanf函数不安全,它会建议我们使用scanf_s来替换scanf,但是,scanf_s只是VS里面所提供的,当我们将代码转移到其他编译器里面的时候,将不能编译,所以,scanf_s只能在VS里面使用,无法体现代码的跨平台性,那我们要解决这个问题,只需在我们的代码的第一行,#define _CRT_SECURE_NO_WARNINGS 1 ,就可以解决scanf函数警告。
作用域:
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围,也就是它只能在它所在的这个局部范围内起作用。
2. 全局变量的作用域是整个工程,只要是在这个工程里面,它都可以起作业。
生命周期:
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:
字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量
int main()
{
3.14;//浮点型常量
55;//整型常量
'a';//字符常量
return 0;
}
简而言之就是直接在代码块里面写出的常量。
int main()
{
const int num = 10;
printf("%d\n", num);//10
return 0;
}
const修饰的常变量之后,被const修饰的这个变量则在后面不能被修改,但是它在本质上还是一个变量,只是不能被改变了,并不能说是被const修饰之后就变为常量了,所以才叫做常变量。
#define MAX 100
#include
int main()
{
//MAX = 200;//err
printf("%d\n", MAX); //100
return 0;
}
#define定义的标识符常量也是不可以被修改的,在这个代码中,如果要修改MAX的值,则会出现错误。
可以一 一列举,但不可以改变的常量(比如,三原色,性别...等等)
枚举关键字-enum
列出三原色:
enum Color
{
RED,
GREEN,
BULE
};
int main()
{
enum Color color = RED;
return 0;
}
我们来将枚举常量打印出来:
#include
enum Color
{
RED,
GREEN,
BLUE
};
int main()
{
enum Color color = RED;
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
我们可以看到,枚举常量的默认值是从0开始的,一次向下递增1的。
"hello world.\n"
在C语言中:像这种由双引号引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
'A'
在C语言中:由一个单引号引起来的叫一个字符。
//%s - 打印字符串
//%c - 打印字符
用代码来表示字符串和字符:
#include
int main()
{
char ch = 'a'; //表示字符
char arr[] = "abcdef"; //表示字符串
return 0;
}
所以字符串有两种表示方法:
char arr1[]= "abcdef";
char arr2[]= {'a','b','c','d','e','f','\0'};
第一种表示方法:在这个字符串的最后面默认有一个\0
第二种表示方法:在这个字符串的最后面要加上\0
我们再来了解一个新的概念:\0
字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串的内容。
当我们知道了\0,我们来打印字符串看看效果:
#include
int main()
{
char arr1[] = "abc"; //这种默认有\0,所以打印到c就停止打印
char arr2[] = {'a', 'b', 'c'}; //这种后面如果不加\0,则会有什么效果呢?
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
我们可以看到,我们的字符串arr2中只有abc,但是为什么后面还有这么多奇怪的数字呢?
那是因为,我们没有加\0,所以,当打印字符串的时候,在打印完c之后没有遇到\0,所以就会一直打印一串随机的值,直到遇到\0才会停止打印,所以,在打印完c之后,再打印的值我们无法知道,是一串随机的值,arr1中的字符串后面默认就有一个\0,所以在打印完c之后,就会停止打印。
#include
int main()
{
char arr1[] = "abc";
char arr2[] = {'a', 'b', 'c','\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
当在arr2中加上\0之后,我们打印的值就是我们所要的值。
当我们打印字符串的时候,打印到\0就停止
当我们求字符串长度的时候,也是要找到\0,统计的是\0之前出现的字符串个数
用代码求字符串的长度:
当我们求字符串长度的时候要用到库函数strlen
在使用strlen函数时,要引用头文件#include
#include
#include
int main()
{
int len1 = 0;
int len2 = 0;
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c','\0' };
len1 = strlen(arr1);
len2 = strlen(arr2);
printf("%d\n", len1);
printf("%d\n", len2);
return 0;
}
可以看到arr1和arr2的长度都是3,这也就说明了在计算字符串长度时,也是遇到\0就停止计算,也就是说strlen函数在计算字符串长度时,只统计\0之前的字符串个数。如果不加\0,那得到的结果就是一个随机值。
假如我们要在屏幕上面打印一个目录:c:\code\test.c
那我们该如何写代码呢?
#include
int main()
{
printf("c:\code\test.c\n");
return 0;
}
当我们运行起来的结果却大不相同
那这是为什么呢?
是因为\后面跟的某一些字母、数字、符号合起来表示的是一种转义字符的意思,转义字符顾名思义就是转变意思,那我们来看一下常见的转义字符:
转义字符 |
释义 |
\? |
在书写连续多个问号时使用,防止他们被解析成三字母词 |
\' |
用于表示字符常量' |
\'' |
用于表示一个字符串内部的双引号 |
\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a |
警告字符,蜂鸣 |
\b |
退格符 |
\f |
进纸符 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\ddd |
ddd表示1~3个八进制的数字 |
\xdd |
dd表示2个十六进制数字 |
我们了解了转义字符,我们再来打印一个目录:c:\code\test.c
#include
int main()
{
printf("c:\\code\\test.c\n"); //我们这里使用\\将\c,\t原本的意思转变
return 0;
}
当我们使用\\将\c,\t的意思转义,我们就可以打印目录。
\ddd是一个转义字符,表示的意思:ddd转化为10进制时所表示的ASCII码值,其中ddd表示1~3个八进制的数字。
我们用一段代码来表示一下:
\137----137是一个8进制的数字,转化为10进制是95,95所表示的ASCII码值是 _
#include
int main()
{
char a = 0;
a = '\137'; //\137是一个字符所以放在''里面
printf("%c\n", a); //打印字符用%c
return 0;
}
这里要注意:\ddd,这里面的一定是8进制的数字,8进制的数字要小于8,比如:\138,这就是两个字符:\13 和8,所以打印的时候打印的是13转化为10进制所对应的ASCII码值和8.
\xdd是一个转义字符,表示的意思是dd转化为10进制所表示的ASCII码值,其中dd表示2个十六进制数字。
我们来打印一下\x78
这里的78是一个16进制的数,转化为10进制是120,120所表示的ASCII码值是x
#include
int main()
{
char a = 0;
a = '\x78';
printf("%c\n", a);
return 0;
}
注:ASCII码值所表示的数的范围是有限的0~127,如果转化过后的值超过这个范围将不会打印出想要的结果。
说到这里,我们再来看一串代码:
#include //使用strlen函数要包含头文件
#include
int main()
{
char arr[] = "c:\test\628\test.c";
int len = strlen(arr); //计算arr字符串的长度
printf("%d\n", len);
return 0;
}
我们来计算一下这一串字符的长度,各位读者可以想一想这个结果是多少
这个字符串的结果是14,我们来一起看一下:
画的图有点挫,我们来将就的看一下,\t是一个转义字符算作一个字符,\62是类似于\ddd类型的转义字符也算作一个字符(这里的8不属于8进制的数字,所以是一个单独的字符)
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字
#include
int Add(int x, int y)
{
return x + y;
}
/*C语言风格注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
//C++注释风格
//int a = 10;
//调用Add函数,完成加法
printf("%d\n", Add(1, 2));
return 0;
}
注释有两种风格:
C语言风格的注释 /*xxxxxx*/
缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行(建议使用C++注释风格)
伙计们,本篇的分享就到此结束,感谢各位阅览,如果有什么不足或者是看不懂的地方可以留在评论区,感谢大家!