初识C语言(二)
前言
👻作者:龟龟不断向前
👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏:C++初阶知识点
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正
初识C语言(二)
文章目录
🚀1.作用域与生命周期
🍉作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
的而限定这个名字的可用性的代码范围就是这个名字的作用域。
🍇局部变量作用域
局部变量所在的局部范围(代码块)
#include<stdio.h>
int main()
{
{
int a = 0;
printf("%d\n", a);
}
printf("%d\n", a);//error,由于a的作用域是上一个代码块,无法在这一行使用
return 0;
}
通常我们将 {}所包围的区域 叫做 代码块
这里有些同学经常误认为局部变量的作用域是main函数的范围,这是不准确的,局部变量所在的{}范围是其对应的作用域!
🍇全局变量的作用域
整个工程–局部变量不仅仅只局限于main函数的代码块,在其他的函数代码块依旧能使用。
#include<stdio.h>
int global;//声明
void test()
{
printf("%d\n", global);//这里的值是100000
}
global = 100000;//不写这个,输出0,全局变量默认值为0
int main()
{
printf("%d\n", global);
test();
return 0;
}
这里我们可以看到,局部变量global
不仅仅在main函数的代码块可以用,在test函数的代码块也可以使用
上述代码对
global
进行声明的原因是,编译器是向上扫描,向下执行的,如果不写int global;
这句代码,那么编译器执行test函数的时候,就不知道global
是什么意思了,int global;
就是告诉编译器后面有global
这个全局变量,而且值由后面的定义决定(默认是0)
不仅如此,就算是多个源文件中只有一个全局变量,这个全局变量也可以在每个源文件中都可以使用,因为其作用域是整个工程
这样全局变量global
也是可以正常使用的
注意,如果全局变量在外部源文件中,声明方式和上面的略有不同,需要在前面加上==extern
关键字–进行外部声明。==
🍉生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
作用域和生命周期是两个不同的概念,但是他们之间又是存在联系的
🍇局部变量的生命周期
程序也是有生命周期的,或者说是运行时间。而我们上述所说的,局部变量的作用域与其声明周期是有联系的。
局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束。
🍇全局变量的生命周期
全局变量的生命周期是:整个程序的生命周期。
🚀2.常量
🍉const
修饰的常变量
用法如下:
#include<stdio.h>
int main()
{
const int n = 10;
n = 200;//error
return 0;
}
我们可以发现上述代码是编不过去的,n不允许被修改,这就和常量很像了,常量是不变的
可是为什么又叫常变量呢?
在此之前我们要介绍以下数组的概念
C语言中给了数组的定义:一组相同类型元素的集合
语法:元素类型 + 数组名 + [元素个数]//元素个数只能是常量
#include<stdio.h>
int main()
{
const int n = 10;
int arr[n];//error--报错
return 0;
}
这里我们运用了数组元素个数必须是常数的属性,进而证明了上述的n其实还是一个变量,只是具备了常属性(不能被修改)而已
🍉#define
修饰的标识符常量
目前文章暂时不做深究,大家了解其用法即可
#define M 10
#include<stdio.h>
int main()
{
printf("%d\n", M);
int arr[M];
return 0;
}
🍉枚举常量
一 一列举出一些常量
enum RGB//三原色
{
RED,
GREEN,
BLUE
};
int main()
{
enum RGB Color = BLUE;
printf("%d\n", RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
int arr[BLUE];//无意义--只是为了测试枚举常量是常量
return 0;
}
还是一样对齐不做深究,大家先知道有这么个东西即可
🚀3.字符串
"hello bit.\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符
串。注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串
内容。
🍉定义字符串
既然字符串是一串字符,但是我们前面介绍的数据类型里面并没有字符串类型,但是咱么可以使用字符数组来存储字符串
#include<stdio.h>
int main()
{
char str1[] = { 'a', 'b', 'c' };
char str2[] = "abc";
printf("%s\n",str1);//%s--输出字符串
printf("%s\n",str2);
return 0;
}
上述代码定义数组的时候,[]里面并没有填元素个数,这个语法是允许的,编译器会自动帮我们计算元素个数,然后填入[]
上述的str
,str2
看似定义相同,其实天差地别
根据字符串的定义:双引号引起来的一串字符叫做字符串,并且字符串是有\0作为结束标志的,所以"abc"
看似只有abc
其实暗含着\0
,所以\0
也放入了数组str2
中。所以str1
会abc
后输出随机值(随机值里面也可能有\0),而str2
正常输出
🍉计算字符串的长度
库里面设计了一个函数
strlen
帮助我们直接计算字符串的长度
strlen
- string length
#include<stdio.h>
int main()
{
char str1[] = { 'a', 'b', 'c'};
char str2[] = "abc";
printf("%s:", str1);
printf("%d\n", strlen(str1));
printf("%s:", str2);
printf("%d\n", strlen(str2));
return 0;
}
这个11并不是必然产生的是随机的,大家运行上述代码可能是其他值。
🍉转义字符
有些字符看起来是\0,\n,\t,但是他们已经不再是原来的意思了,而被转变成了其他意思
例如我们经常写的\n–换行的意思
这样的字符我们将其成为转义字符
这里特别提醒大家,转义字符算一个字符,算字符串长度的时候大家要注意
其中转义字符有\
和一些特定字符和数字组成
下面给大家列出C语言全部的转义字符
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词(现在编译器大部分没有) |
\' | 用于表示字符常量’ |
\“ | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a(assert) | 警告字符,蜂鸣 |
\b (backspace) | 退格符 |
\f (几乎无作用) | 进纸符 |
\n | 换行 |
\r | 回车 |
\t (Tab) | 水平制表符 |
\v(vertical) | 垂直制表符 |
\ddd | ddd 表示1~3个八进制的数字。 如: \130 X |
\xdd | dd 表示2个十六进制数字。 如: \x30 0 |
不需要死记硬背,这里我们稍微理解一下:像'
,"
,\
,如果我们像下面那样是没有办法打印出来的
#include<stdio.h>
int main()
{
printf("%c\n", '\');
printf("%c\n", ''');
printf("%c\n", '"');
return 0;
}
如果这么写属实是把编译器给逼死了,编译器也不知道怎么识别,\
是帮助编译器识别转义字符的,'
是帮助编译器识别字符的,"
是帮助编译器识别字符串的。如果后面什么都不加,编译器也识别不出来!
要想正常输出他们必须在前面加上\
#include<stdio.h>
int main()
{
printf("%c\n", '\\');
printf("%c\n", '\'');
printf("%c\n", '\"');
return 0;
}
中间的那部分转义字符大家可用下面代码自行复制测试!
int main()
{
printf("\a\n");//警告声assert
printf("abcdef\bg\n");
printf("abcdef\tg\n");
printf("abcdef\vg\n");
printf("C\\code\\classC\\test.c\n");//正常输出要多加一个\
return 0;
}
我们主要细讲\ddd
,\xdd
这里我们介绍一下ASCII码
概念:
ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 [1] 。
说人话就是:为了很好地在内存中存储字符,我们键盘上,甚至键盘上没有的一些字符都对应这一个自己的编号。
例如a - 97 ,b - 98
ASCII码表:(键盘上面都敲出来的都有自己的ASCII码值)
\ddd
~1-3位的八进制数字,转换成十进制数字,在ASCII码中所对应的字符
\xdd
~1-2位的十六进制数字,转换成十进制数字,在ASCII码中所对应的字符
这里我们讲一下,二进制,八进制,十六进制的联系转换成十进制
八进制和十六进制类似,a进制是由0-a-1的数字构成的
#include<stdio.h>
int main()
{
printf("%c\n", '\123');//1*64 + 2*8 + 3*1 = 83
printf("%c\n",'\x61');// 6*16 + 1 = 97
return 0;
}
讲上面的数字算出来了之后,查一下ASCII码表即可
83-S,97-a
🍉笔试题
#include <stdio.h>
//转义字符算一个字符
int main()
{
printf("%d\n", strlen("abcdef"));
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
要会区分转义字符是哪些
🚀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++风格的注释
//xxxxxxxx
-
可以注释一行也可以注释多行
🚀5.选择语句
人生处处面临选择,就比如一不小心你可能就遇到下面的场景
这书流程图是博主自己画的,画流程图推荐软件
🍉if-else语句
#include <stdio.h>
int main()
{
int input = 0;
printf("卡密萨马:请问这个金的斧头是你的?还是这把银斧头是你的?\n");
printf("1-金斧头,2-银斧头,neither-都不是\n");
scanf("%d", &input);
if (input == 1)
{
printf("你撒谎,you bad bad\n");
}
else if (input == 2)
{
printf("你撒谎,you bad bad\n");
}
else
{
printf("你真是个城市的孩子,请回吧\n");
}
return 0;
}
大家可以结合上述的流程图来理解if-else语句
C语言中,我们使用==
来表示相等,当if括号里面的是式子正确的时候,就会执行if里面的语句,不对的画就不执行!
🚀6.循环语句
生活中处处有循环,例如以下情况
🍉while循环语句
int main()
{
int line = 0;
char input = 0;
while (line <= 20000)
{
printf("敲代码,line = %d\n",line);
++line;
if (line == 5000)
{
printf("恭喜你,已经敲了5000行有效代码,是否要去谈一场轰轰烈烈的恋爱\n");
printf("Y-yes,N-NO\n");
scanf("%c", &input);
if (input == 'Y')
{
break;
}
}
}
if (line > 20000)
{
printf("恭喜你,大牛,好offer\n");
}
else
{
printf("你的女朋友放弃了你。你成为了FW\n");
}
return 0;
}
break
可以中途退出循环语句
本篇文章就到这,我们下期再见!