初识C语言(二)

前言
作者龟龟不断向前
简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
专栏:C++初阶知识点

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正

初识C语言(二)

文章目录

    • 初识C语言(二)
    • 初识C语言(二)
      • 1.作用域与生命周期
        • 作用域
          • 局部变量作用域
          • 全局变量的作用域
        • 生命周期
          • 局部变量的生命周期
          • 全局变量的生命周期
      • 2.常量
        • `const`修饰的常变量
        • `#define`修饰的标识符常量
        • 枚举常量
      • 3.字符串
        • 定义字符串
        • 计算字符串的长度
        • 转义字符
        • 笔试题
      • 4.注释
      • 5.选择语句
        • if-else语句
      • 6.循环语句
        • while循环语句

1.作用域与生命周期

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
的而限定这个名字的可用性的代码范围就是这个名字的作用域。

局部变量作用域

局部变量所在的局部范围(代码块)

#includeint main(){{int a = 0;printf("%d\n", a);}printf("%d\n", a);//error,由于a的作用域是上一个代码块,无法在这一行使用return 0;}

​ 通常我们将 {}所包围的区域 叫做 代码块

这里有些同学经常误认为局部变量的作用域是main函数的范围,这是不准确的,局部变量所在的{}范围是其对应的作用域!


全局变量的作用域

整个工程–局部变量不仅仅只局限于main函数的代码块,在其他的函数代码块依旧能使用。

#includeint global;//声明void test(){printf("%d\n", global);//这里的值是100000}global = 100000;//不写这个,输出0,全局变量默认值为0int main(){printf("%d\n", global);test();return 0;}

​ 这里我们可以看到,局部变量global不仅仅在main函数的代码块可以用,在test函数的代码块也可以使用

上述代码对global进行声明的原因是,编译器是向上扫描,向下执行的,如果不写int global;这句代码,那么编译器执行test函数的时候,就不知道global是什么意思了,int global;就是告诉编译器后面有global这个全局变量,而且值由后面的定义决定(默认是0)


​ 不仅如此,就算是多个源文件中只有一个全局变量,这个全局变量也可以在每个源文件中都可以使用,因为其作用域是整个工程

​ 这样全局变量global也是可以正常使用的

注意,如果全局变量在外部源文件中,声明方式和上面的略有不同,需要在前面加上==extern关键字–进行外部声明。==


生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

作用域和生命周期是两个不同的概念,但是他们之间又是存在联系的

局部变量的生命周期

​ 程序也是有生命周期的,或者说是运行时间。而我们上述所说的,局部变量的作用域与其声明周期是有联系的。

局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束。

全局变量的生命周期

全局变量的生命周期是:整个程序的生命周期。


2.常量

const修饰的常变量

用法如下:

#includeint main(){const int n = 10;n = 200;//errorreturn 0;}

​ 我们可以发现上述代码是编不过去的,n不允许被修改,这就和常量很像了,常量是不变的

可是为什么又叫常变量呢?

在此之前我们要介绍以下数组的概念

C语言中给了数组的定义:一组相同类型元素的集合

语法:元素类型 + 数组名 + [元素个数]//元素个数只能是常量

#includeint main(){const int n = 10;int arr[n];//error--报错return 0;}

​ 这里我们运用了数组元素个数必须是常数的属性,进而证明了上述的n其实还是一个变量,只是具备了常属性(不能被修改)而已


#define修饰的标识符常量

​ 目前文章暂时不做深究,大家了解其用法即可

#define M 10#includeint 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 是结束标志,不算作字符串
内容。

定义字符串

​ 既然字符串是一串字符,但是我们前面介绍的

​ 根据字符串的定义:双引号引起来的一串字符叫做字符串,并且字符串是有\0作为结束标志的,所以"abc"看似只有abc其实暗含着\0,所以\0也放入了数组str2中。所以str1abc后输出随机值(随机值里面也可能有\0),而str2正常输出


计算字符串的长度

库里面设计了一个函数strlen帮助我们直接计算字符串的长度

strlen– string length

#includeint 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语言全部的转义字符

转义字符释义
\" />

要想正常输出他们必须在前面加上\

#includeint main(){printf("%c\n", '\\');printf("%c\n", '\'');printf("%c\n", '\"');return 0;}

​ 中间的那部分转义字符大家可用下面代码自行复制测试!

int main(){printf("\a\n");//警告声assertprintf("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的数字构成的

#includeint main(){    printf("%c\n", '\123');//1*64 + 2*8 + 3*1 = 83printf("%c\n",'\x61');// 6*16 + 1 = 97    return 0;}

讲上面的数字算出来了之后,查一下ASCII码表即可

83-S,97-a

笔试题

#include //转义字符算一个字符int main(){printf("%d\n", strlen("abcdef"));printf("%d\n", strlen("c:\test\628\test.c"));return 0;}

要会区分转义字符是哪些


4.注释

  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

  • 可以注释一行也可以注释多行


5.选择语句

​ 人生处处面临选择,就比如一不小心你可能就遇到下面的场景

这书流程图是博主自己画的,画流程图推荐软件

if-else语句

#include 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可以中途退出循环语句

本篇文章就到这,我们下期再见!

Copyright © maxssl.com 版权所有 浙ICP备2022011180号