[简明C语言]C语言概述P_2:变量/常量/字符串/转义字符/注释
前言
C语言功能强大,使用灵活,既可以用于编写应用软件,又用于编写系统软件。熟练掌握C语言是在计算机科学与技术专业学习中计算机开发人员的一项基本功。本文记录了简明C语言_C语言概述的第二部分内容。
1. 初识变量、常量
在生活中,有一些值是不变的,如性别、血型等;
有一些值是可变的,如身高、体重等。
在C语言中不能改变的值用常量的概念表示,能改变的值用变量的概念表示。
(1)变量
定义变量的方法
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表。给变量赋予一个初始值,就是变量初始化。
#include<stdio.h>
int main()
{
//创建一个变量
//指定类型 变量的名字 = 数值;
int age = 20;
double weight = 99.8;
age = age + 1;
weight = weight - 10;
printf("%d\n", age);//整型输出%d
printf("%lf\n", weight);//双精度浮点型输出%lf
return 0;
}
运行结果如图所示:
变量的分类
- 局部变量
全局变量具有全局作用域.全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
- 全局变量
局部变量也只有局部作用域,它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
#include<stdio.h>
int global = 2022;//全局变量 - {}外部定义的
int main()
{
int local = 2021;//局部变量 - {}内部定义的
//再定义与全局变量global同名的局部变量
int global = 2023;//局部变量
printf("global = %d\n", global);
return 0;
}
运行结果如图所示:
可以发现,定义的局部变量覆盖了全局变量。
当局部变量和全局变量同名的时候,局部变量优先使用。
变量的使用
小练习:实现输入两个数并求两数之和
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int sum = 0;
printf("输入两个操作数:>");
//scanf函数会让我们在键盘输入数据,两个参数就说明输入两个数据
scanf("%d %d", &a, &b);//输入两个整数并赋值给变量a和变量b
sum = a + b;
//printf函数会把sum的值以%d的形式打印到屏幕上
printf("%d\n", sum);
return 0;
}
使用程序计算2022+2:
如图所示,得到结果为2022+2=2024
常见问题
出现报错:
解决方案:进行编译预处理
#define _CRT_SECURE_NO_WARNINGS 1
//放在代码的第一行
不建议使用scanf_s函数,此函数由VS编译器提供,并不是C语言标准。
变量的作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的
而限定这个名字的可用性的代码范围就是这个名字的作用域- 局部变量的作用域是变量所在的局部范围。
- 全局变量的作用域是整个工程。
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
- 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
- 全局变量的生命周期是:整个程序的生命周期。
//作用域和生命周期
//哪里可以使用就是作用域
//局部变量的作用域:就是变量所在的局部范围
//全局变量的作用域:整个工程
#include <stdio.h>
int g_val = 2022;//全局变量
int main()
{
printf("1:%d\n", g_val);//第一次打印全局变量
printf("Hello World!\n");//执行性代码需要写到大括号内
{
printf("2:%d\n", g_val);//第二次打印全局变量
int a = 10;
printf("a = %d\n", a);//a的作用域 - a起作用
}
printf("3:%d\n", g_val);//第三次打印全局变量
return 0;
}
运行结果:
可以发现,打印全局变量全部成功,全局变量在整个工程中都起作用;局部变量只在变量所在的局部范围起作用。
外部变量声明
在新建的源文件add.c文件中定义一个全局变量:
在之前的源文件test.c中不可以直接使用另一个源文件的全局变量,需要外部变量声明。
//声明一下变量
extern int g_val;
#include <stdio.h>
int main()
{
printf("%d\n", g_val);
return 0;
}
运行结果:
可以看到声明外部变量后,就可以使用另一个源文件的全局变量了。
(2)常量
C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
#include <stdio.h>
//举例
enum Sex
{
MALE,//MALE = 3 - 赋初值
FEMALE,
SECRET
};
//括号中的MALE,FEMAL,SECRET是枚举常量
int main()
{
//1.字面常量演示
10;//数字
'a';//字符''
"abcdef";//字符串""
//2.const修饰的常变量
const int num = 10;//const+变量 - num就是常变量 - 具有常属性(不能改变的属性)
//num = 20;//不能直接修改!
//const修饰的常变量在C语言中只是在语法层面限制了变量num不能直接被改变,但是num本质上还是一个变量,所以叫常变量。
//3.#define的标识符常量
#define MAX 100;//定义MAX
//MAX = 200;//不能直接修改!
int n = MAX;//MAX不能改
printf("%d\n", n);//100
//4.枚举常量
enum Sex s = MALE;//只能赋之前的枚举常量中的一个
printf("%d\n", s);//打印出来值是0,默认为0
//MALE = 3;//不能直接修改!
printf("%d\n", FEMALE);//1
printf("%d\n", SECRET);//2
//枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
2. 字符串
在计算机编程中,字符串传统上是一个字符序列,可以是字面常量,也可以是某种变量。字符串通常被认为是一种数据类型,通常被实现为字节(或单词)的数组数据结构,它使用某种字符编码存储一系列元素,通常是字符。
"Hello World.\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
字符串结束标志
字符串结束标志是“\0”
验证一
通过逐过程调试验证:
//F10逐过程调试
int main()
{
//字符数组 - 数组是一组相同类型的元素
char arr[] = "Hello";//[]不写,根据=后的内容初始化[]
return 0;
}
逐过程调试运行至定义字符数组后:
通过调试-窗口-监视窗口可以观察数组:
在监视窗口中输入字符数组名:
可以发现除了’H’、‘e’、‘l’、‘l’、‘o’外还有’\0’。
在字符串中\0就是用%s格式输出的结束标志。
再做一个验证:
#include <stdio.h>
int main()
{
//字符串在结尾的位置隐藏了一个\0字符
//\0是字符串的结束标志
char arr1[] = "abc";//双引号 - 一串字符
char arr2[] = { 'a','b','c' };// 单引号 - 一个字符
//打印字符串
printf("%s\n", arr1);//%s输出字符串
printf("%s\n", arr2);
return 0;
}
逐过程调试至定义字符数组后:
通过监视窗口观察:
可以发现arr1比arr2多一个结束标志\0。
再观察输出结果:
可以发现arr1内容打印完就停止了,而arr2打印出了一些乱码。
#include <stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c','\0' };//添加'\0'
//打印字符串
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
添加结束标志后重新进行打印:
可以看到都打印出了abc,所以字符串的结束标志是至关重要的。
验证二
还可以通过计算字符串长度来验证结束标志\0的作用。
#include <stdio.h>
#include <string.h>//strlen函数需要引用头文件string.h
int main()
{
//求字符串长度
int len = strlen("abc");//string length计算字符串长度
printf("%d\n", len);
return 0;
}
运行结果为:
可以发现计算字符串长度时,没有把结束标志\0包含在内。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' ,};
//求字符串长度
printf("%d\n", strlen(arr1));//求arr1字符串长度
printf("%d\n", strlen(arr2));//求arr2字符串长度
return 0;
}
出现提示:
运行结果为:
可以发现arr1字符串长度为3,arr2字符串长度为随机值。(arr2打印到出现\0才停止)
给arr2添加结束标志
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a','b','c' ,'\0'};//添加结束标志
//求字符串长度
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
运行结果为:
可以发现字符串长度都为3,所以字符串的结束标志是至关重要的。
注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0
是结束标志,不算作字符内容。
3. 转义字符
假如要在屏幕上打印一个目录:c:\test\test.c
该如何编写代码?
#include <stdio.h>
int main()
{
printf("c:\test\test.c\n");
return 0;
}
实际运行结果为:
\t在运行中转变成水平制表符。
转义字符:转变了原来的意思。
再比如:
#include <stdio.h>
int main()
{
printf("ab\ncd");
return 0;
}
实际运行结果为:
\n转变成换行
转义字符顾名思义就是转变意思。
常见的转义字符
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1-3个八进制的数字。如:\130 X |
\xdd | dd表示2个十六进制数字。如:\x30 0 |
- 实例
\?
:
#include <stdio.h>
int main()
{
printf("(are you ok??)");//??) -- ] - 三字母词
//打印会显示(are you ok]
return 0;
}
转义?即可解决
#include <stdio.h>
int main()
{
printf("(are you ok\?\?)");//转义\?
return 0;
}
运行结果:
- 实例
\'
:
#include <stdio.h>
int main()
{
printf("%c\n", ''');
return 0;
}
无法运行打印单引号:
前两个相连的单引号’会被认为是一对单引号,使用转义字符解决问题
#include <stdio.h>
int main()
{
printf("%c\n", '\'');//转义\'
return 0;
}
运行结果:
- 实例
\"
:
同\'
#include <stdio.h>
int main()
{
printf("%s\n", "abc");//打印字符串
printf("%s\n", "a");//打印单个字符
printf("%s\n", "\"");//打印双引号" - 转义字符\"
return 0;
}
运行结果:
[复习]:
//printf在打印数据的时候,可以指定打印的格式
printf("%d", 100);//整型
printf("%c", 'a');//字符型
printf("%s", "abc");//字符串
- 实例
\\
:
#include <stdio.h>
int main()
{
printf("c:\\test\\test.c");//转义\\
return 0;
}
运行结果:
特殊转义字符
\ddd
#include <stdio.h>
int main()
{
printf("%c\n", '\130');//8进制 - 88 -'X'
return 0;
}
运行结果为:
如何得到的呢?
八进制中130转换为十进制的88对应的ASCII码值代表的字符是X。
\xdd
#include <stdio.h>
int main()
{
printf("%c\n", '\x30');//16进制 - 48 - '0'
return 0;
}
运行结果为:
十六进制中30转换为十进制的48对应的ASCII码值代表的字符是0。
ASCII码值
ASCII是美国信息交换标准代码。
给键盘上敲出的字符!@QWE123等每个字符规定一个值——ASCII码值
▷笔试题
//程序输出什么?
#include <stdio.h>
#include <string.h>
int main()
{
printf("%d\n", strlen("abcdef"));
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
答案是6和14
第一个问题很简单,abcdef,共6个字符。
第二个问题中\t
作为转义字符,算1个字符;八进制中没有数字8,所以\32
作为转义字符,算一个字符,8算一个字符,共14个字符。
运行结果:
4. 注释
- 代码中又不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
例如:
#include <stdio.h>
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++风格的注释是
//xxxxxx
- 可以注释一行也可以注释多行
总结
本文初步介绍了变量、常量、字符串、转义字符、注释,帮助认识C语言。