文章目录
前言
继上一篇文章,本篇文章将上一篇未讲述的变量部分补充完整,同时也将讲述字符串、转义字符和注释,以及选择语句、循环语句等相关知识。
一、变量与常量
1.1变量的作用域与生命周期
作用域(scope):是程序设计的概念,通常来说,一段代码中所用到的名字并不总是有效的的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
上面是作用域的概念,我们简单理解一下:作用域就是起作用的范围,一个变量在哪里可以使用,那里就是作用域
生命周期:变量创建到销毁的一个时间段,也就是进入作用域,变量的生命周期开始;离开变量的作用域,生命周期结束
1.1.1局部变量作用域和生命周期:
直接上代码:
#include<stdio.h>
void test()
{
printf("%d\n", a);//此处用a,但a在main函数的{}内定义,此处并非是其作用域固不可使用。//此处是错误代码
}
int main()
{
int a = 10;//此处定义的a,并且a在main函数的{}内-->a是局部变量
printf("%d\n", a);//作用域内,可以使用a
{
int b = 20; //此处定义的b,在{}内,是局部变量,
printf("%d\n", b);//作用域内,可以使用b
printf("%d\n", a);//此处虽然在另一个{}内,但同时也在定义自己的main函数{}内,固仍然在作用域中,可以使用。
}
printf("%d\n", b);//但在此处,已经离开b的作用域(b所在{}外),所以b不能使用也可以说,b的生命周期结束了。//此处也是错误代码
return 0;
}
1.1.2全局变量的作用域:
#include<stdio.h>
int a = 100;//此处在大括号外部,是全局变量a。
void test()
{
printf("2:%d\n", a);//此处可以使用a,语法正确,但没必要
//因为主函数没有调用,test函数未被调用,依然不会打印a。
//程序是从main函数开始,遍历main函数后,程序结束。
}
int main()
{
printf("1:%d\n", a);//在a的作用域内,可以使用。
return 0;
}
1.1.3一点思考
不会调试的同学,先看第一张图,再转而看第二张图。相信你会豁然开朗。
会调试的同学,可以复制我的代码用自己的编译器,调试一下,就可以轻松明白test函数中的a也在作用域内,
#include<stdio.h>
void test()
{
printf("2:%d\n", a);//此处a可以使用,在作用域内,尝试调试找到原因。
}
int main()
{
int a=100;//a是局部变量,在main函数{}内部。
printf("1:%d\n", a);//在作用域内,可以使用
test();//调用test函数,
return 0;
}
我们变形一下,看另一张图。
#include<stdio.h>
int main()
{
int a=100;//局部变量
printf("%d\n", a);//作用域内,可以使用
void test();
{
printf("%d\n", a);//a虽然在test函数的{}内,但其仍然在mian函数的{}内部;固在作用域内。
}
return 0;
}
看完后有没有豁然开朗呢?
1.2.常量
C语言中常量和变量的定义有所差异
1.2.1常量的种类
a.字面常量
100 整形字面常量
‘D’ 字符字面常量
3.14 浮点型字面常量
"abcdef"字符串常量
b.const修饰的常变量
const int num = 10;//num本质是变量,具有常属性,不能被修改,可以认为被上锁了,不让你变化。
printf("%d\n", num);//10
num = 20;//num此时具有了不能修改的属性,但本质是变量,此处编译器报错。
printf("%d\n", num);//10
简单验证一下常变量是常量还是变量
#include<stdio.h>
int main()
{
//数组
int arr1[10]={0};//正确
int num=10;
int arr2[num]={0};//此句代码也会报错,因为num是变量
const int n = 10;
int arr[n] = { 0 };//表达式必须包含常量、n虽然被const修饰,具有了常属性,不能被修改,但是本质上还是变量,不能用来指定数组的大小。//此句代码会报错,所以常变量是变量。
//下面代码在支持C99的编译器中是可以编译的
//在C99中,引入了:变长数组的概念,变长数组的大小是可以使用变量来指定的,但是数据不能初始化
//VS2022是不支持C99中的变长数组,所以没法验证。看下图验证
// int n = 10;
// int arr[n];
return 0;
}
VS不支持:
此处使用vim编辑器,gcc编译器。
我们会发现,边长数组是不可以初始化,且只有支持C99语法编译器的才可以使用。
c. #difine定义的标识符常量
先学会怎样写,后续会再次学习。
//#define 定义的标识符常量
#define MAX 1000//不要加分号
int main()
{
int arr[MAX];
#define MIN 0//不要加分号
printf("%d\n", MAX);
//MAX = 2000;此句代码会报错,MAX不可改。
printf("%d\n", MIN);
return 0;
}
d. 枚举常量
//枚举常量
//枚举——enum关键词
//枚举:有穷个,且包含较少项目。
//性别:男、女、保密
//三原色:Red Green Blue
//血型:ABO血型系统:A、B、O、AB
Rh血型系统:Rh阳性、Rh阴性
//有穷个,但包含项目很多。或者无穷个。
enum Sex
{
//下面三个符号是Sex这个 枚举类型 的未来的可能取值
//枚举常量男、女、保密
MALE=5,//0 //5,此处可以赋值
FEMALE,//1 //6
SECRET //2 //7
};//分号不要忘记
int main()
{
enum Sex s=FEMALE;//可以看作一种类型enum Sex ,s是名字,给其赋值,只能赋自己所包含的项。
//默认取值0开始递增
//赋初值,再递增
printf("%d\n", MALE);//0
printf("%d\n", FEMALE);//1
printf("%d\n", SECRET);//2
//MALE=5;常量不可改变,不能再此处赋值
return 0;
}
二、字符串、转义字符、注释
2.1字符串
2.1.1 字符
字符:电脑上面能敲出来的单个符号
‘a’
‘w’
'1’和1不一样
字符串:由双引号引起来的一串字符
“abcde”
特别注意:字符串结束标志是 \0(转义字符),且 \0 不算入字符串内容。
接下来验证\0的存在,并学习strlen函数的使用
记得引用头文件:string.h
#include<string.h>
int main()
{
char c1 = 'a' ; //切记使用单引号
// 字符型 变量名= '字符';
char c2 = 'b';//字符
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
int len=strlen(arr1);//此处计算"abc"的长度————3
printf("%d\n", len);//3
len = strlen(arr2);//此处计算数组arr2的长度,可是字符串,需要\0结束,而初始化并没有给出。所以编译器会在内存中继续寻找。直到找到\0.结束 。
printf("%d\n", len);//此处打印随机值,结果看下图。
//strlen 是一个库函数,专门用来求字符串长度的
int len2 = strlen("abcdef");// abcdef\0
//strlen在求字符串的长度时,统计的是\0之前的字符个数
printf("%d\n", len);//6
return 0;
}
好烫!!!哈哈哈
2.2转义字符:让原字符意义改变
// \0
// \n
//转义字符
int main()
{
printf("abcndef\n");
printf("abc\ndef");//换行了
printf("abc0def");//默认有\0
printf("abc\0def");//字符串提前结束了
return 0;
}
在ANSI C标准中,定义了9个三字母词(trigraph),三字母词就是几个字符的序列,合起来表示另一个字符。三字母词使C语言环境可以在缺少一些必需字符的字符集(比如,一些非常老式的键盘上没有[]{}#^~|)上实现
显然可以看到VS2022不支持三字母词。
在支持三字母词的编译器上:
从上表可以发现三字母词借助于?实现。
(are you ok ??)实际是(are you ok]
(are you ok ??)实际是(are you ok ? ? )
?是转义字符的一种
int main()
{
// \?
// 三字母词
// ??) ——> ]
printf("(are you ok??)");//
//(are you ok ??)实际是(are you ok]
//(are you ok]
//(are you ok \?\?)
printf("%c\n", 'a');
printf("%c\n", 'q');
printf("%c\n", '\'');//此处打印一个单引号,但其会自动和括号内的’配对,导致报错,所以使用转义字符 \'
printf("%s\n", "abc");
printf("%s\n", "a");
printf("%s\n", "\"");// 此处与单引号类似,自动配对
return 0;
}
#include<stdio.h>
int main()
{
printf("%s\n", "abc\\ndef"); //前一个\取消了后面 \n的作用,与前面\' \" \?类似 但自身\还保留。
printf("c:\\net\\nest.c");//前面一个\取消了后面\n的作用,与前面\' \" \?类似 但自身\还保留,根据这个特性,可以写你电脑中某个文件的路径
printf("\a");//电脑嗡鸣声,把声音放大即可。\a
printf("ab\bcdef");// \b ,退格(删除光标前一个),打印结果:acdef
printf("%c\n", '\130');//ASCII. /ddd 八进制(随后讲解)
printf("%c\n", '\51'); //感兴趣可以去了解万国码。
printf("%c\n", '\x63'); //xdd 十进制(随后讲解)
return 0;
}
2.3注释
1.代码中有些不需要的代码可以直接删除,也可以注释掉。——使其不起作用
2.代码中有些代码难以理解,加文字注释,便于解读
注释有两种风格:
C语言注释风格:
/XXXXXX/
不能嵌套注释。
c++注释风格:(C99之后也支持)
//xxxxxx
可以注释一行到多行。
三.选择语句
if else 语句
switch case语句
int main()
{
int input = 0;
printf("你要好好学习吗(1/0)?\n");
scanf("%d", &input);
if (input == 1)
{
printf("取得好offer\n");
}
else
{
printf("卖红薯\n");
}
//switch语句后面会学到
return 0;
}
4.循环语句
for语句
while语句
do while语句
int main()
{
int line = 0;
printf("好好学习\n");
while (line < 20000)
{
//...
printf("敲代码:%d\n", line);
line++;
}
if (line >= 20000)
{
printf("获得好offer,迎娶白富美\n");
}
return 0;
}
总结
今天的分享到这里就结束了,有些地方随后会细细道来。感兴趣的请持续关注。
拜拜了您嘞!