C语言初识(二)

前言

上篇文章讲了一些基础知识,以及计算机语言的一些发展,介绍了数据类型,第一个C语言程序,变量和常量(在本篇继续补充,没介绍完)。

相信大家对C语言有了一些认识,我也有了很深的体会,对于C语言也有了一些以前没有的认知。

我们接下来继续学习介绍。

目录

前言

文章目录

 四、变量、常量(补充)

(5)变量的作用域和生命周期

 (6)常量

五、字符串+转义字符+注释

(1)字符串

(2)转义字符

六、注释

七、选择语句

八、循环语句

 (1)while语句



 四、变量、常量(补充)

(5)变量的作用域和生命周期

作用域

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

 1、局部变量的作用域是变量所在的局部范围。

 2、全局变量的作用域是整个工程。

我们来举一个例子:

#include <stdio.h>
int main()
{{int a = 1;}printf("%d\n",a);return 0;
}

 这里的代码,会出现错误,a打印不出来,这里a是局部变量,而a在第一个大括号内,出来了就不可以,这就是作用域。俗话来说就是只有在作用域内才可以运行。一个大括号就代表一个代码块。

就像租公寓,一个大房子,里面好几个屋子,而你只租了一间屋子,那就是属于你活动的地方,也就是你的自己的作用域。

全局变量在大括号外写就是,例如下面的代码:

#include <stdio.h>
int b=2;
int main()
{printf("%d\n",b);return 0;
}

我们这里打印b,程序一运行就打印出来了b的值,所以这个全局变量就可以在任意函数或者代码主函数内部使用,但注意,代码进行扫描的时候,是从头到尾进行扫描,有些复杂的代码只要沉住气,一句句读下去,就会理解。

如果在后面定义全局变量,要先声明,一般定义变量或者常量的时候都写在最前面,非必要时刻不要定义在后面。

生命周期

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

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

2.全局变量的作用域是整个工程。

可以看看下面的例子进行理解:

#include <stdio.h>
int mian( )
{{int a = 666;printf("%d\n" , a);}printf("%d\n" , a);return 0;
}

这个代码和刚才的一样,这里变量a的值我们赋予666,通过刚才的了解我们知道他的作用域只在第一个大括号(代码块)里,所以第一个printf可以运行,第二个不可以运行,当赋予a666时后运行结束后,出来了第一个大括号后,a这个变量就没有用了,没有用了不能平白无故的消失,那不就闹鬼了,它实际上又把内存还给了计算机系统,就等于a这个变量还回去了,也就没了。所以局部变量a的生命周期就是进入这个作用域开始,出了作用域结束。所以第二个printf才不会有用,因为变量a这时候都已经还给内存了,都没有了还调用什么。

而对于全局变量来说,全局变量的作用域是主函数整个范围,主函数还是程序的生命周期,所以全局变量在真个主函数范围内都可以使用,它的生命周期也就是整个程序。

 (6)常量

C语言中的常量和变量的定义的形式有所差异。

C语言中的常量分为以下几种:

字面常量

const 修饰的常变量

#define 定义的标识符常量

枚举常量

 字面常量 

字面常量,你写出数字,字符,字符串,浮点数都叫字面常量,从字面上直接写出的不能修改的就是字面常量。

const修饰的常变量

const修饰的常变量,在定义一个变量的时候,后面是可以修改这个变量的值的,比如前面定义一个整形变量a为999,那么完全可以在写一个赋值语句将a等于另一个值,这样a的值就会发生改变,而当在整形变量前面加上一个const的时候,这个变量就有了常属性,也就不能被修改,虽然此时不能被修改,但是编辑器还是认为它是一个变量,所以他叫常变量。我们可以验证是否为变量。如下:

const int n = 20;
int arr[n] = {0};

一般定义数组的时候,里面要求要写常量来说明数组里有多少个数量,如果里面是变量编辑器会报错让你写一个常量,这里我们给n加上了const,此时n具有了常量的性质,语法层面限制了n,不能被修改,但当我们编译的时候,还是会报错,编辑器还是会说你这个n应为常量值,应输入常量表达式,所以从这里就可以看出加上了const,它本质上还是变量,也完美的诠释了它为什么叫const修饰的常变量。

因为他本质上是变量,出了作用域后还是会被内存销毁收回的。

define定义的标识符常量

#define M 10
int mian( )
{int arr[M]={0};printf("%d\n",M);return 0;
}

可以看出define定义的是常量

枚举常量 

枚举:一一列举,能把可能的值一一列举出来。

例如,血型,性别,三原色等等都可以一一列举,C语言中把这些都定义成枚举类型

enum Color  //枚举
{RED,       //0GREEN,     //1BLUE       //2
};
int main( )
{rnum COlor c=BLUE;return 0;
}

用enum来枚举,里面的RED,GREEN,BLUE就是枚举常量 ,用整形分别打印这三种颜色,编译器会自动将他们仨识别为0,1,2,他们三个是枚举类型Color的可能取值,同时也是常量,所以叫枚举常量。常量不可改动,所以它们是不可以修改的。后续还会继续详细了解。

五、字符串+转义字符+注释

(1)字符串

"hello boy\n"

这种又双引号(Double Quote)引起来的一串字符成为字符串字面值(String Literal),或者简称字符串。

字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算作字符串内容。

int main( )
{char ch1[]={'a','b','c'};char ch2[]="abc";  return 0;}

 定义两个数组,一个放字符,一个放字符串,有什么区别呢,通过F10监视ch1和ch2可以看见字符串末尾隐藏了一个\0,ch1有三个元素,而ch2有四个元素。C语言中字符串末尾都会隐藏一个\0,C语言设计的时候就是这样设计的,但你看不见。

我们通过打印字符串时,%s,是打印到\0为止,如果用%s打印上面的ch1和ch2,那么ch1因为没有\0,他打印完a,b,c之后会出现未知值,因为它没识别到\0,没识别到结束标志,而ch2则正常表示。

当我们求长度的时候,是不算\0的。

C语言提供了一个库函数,可以计算字符串的长度,统计的是\0之前字符的个数

strlen

string length

#include <stdio.h>
#include <string.h>
int main( )
{char ch1[]={'a','b','c'};char ch1[]="abc";int len2=strlen(ch2);printf("%d\n",len2);return 0;
}

我们刚才知道ch2里面有四个元素,但strlen 统计的是\0之前的元素个数,当用strlen来统计ch1的个数时,结果不是3,而是一个不是3的随机数(不同电脑不同数字),因为会一直往后继续访问,直道遇到\0,才会停止,当里面加上‘\0’后,它统计的个数才是3。

(2)转义字符

可以先举两个例子

int main( )
{printf("abndef");             //abndefprintf("abc\ndef");           //abc//defreturn 0;
}

先打印两句话,第一句不加\,第二句加上,结果发生了很大的变化,第一句正常输出全部,而第二句输出了两行,第一行是abc,第二行是def,会发现n消失不见了,发生了显著的变化。

所以,转义就是转变原来的意思。转义字符本质是一个字符,以下有一个转义字符的表格。

\?在书写多个问号时使用,防止他们被解析成三字母词
\'用于表示一个字符常量 '
\''用于表示一个字符串内部的双引号
\\用于表示一个反斜杠
\a警告字符,蜂鸣,当打印这个时候计算机会响一下
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3国人八进制的数字。如\130 X
\xdddd表示2个十六进制的数字。如\x30 0

三字母词,有些编辑器会识别,VS已经不识别了。如果出现这种情况,就可以用\来进行转义,让它意义改变,让他变回原来的意思。

??=#
??([
??)]
??<{
??>}
??//
??!|
??'^
??-~

六、注释

1.代码中有些不需要的代码可以直接删除,也可以注释掉

2.代码中的有些代码比较难懂,可以加一下注释文字。

例如:

int mian( )
{//创建一个整形变量叫a,并赋值10int a = 10;return 0;
}

注释还是有用的,自己留下一些注释,时间长了回来一看,会更加容易上手和理解。

注释信息在编译时是不编译的,因为注释是给人看的,计算机只看没有注释的代码,早期注释风格是/*注释内容*/,也就是C语言注释风格,但这种会出现问题,它是不吃嵌套的,容易出错,C++风格的注释是在开始/,它可以注释一行或者多行,但可以用快捷键来注释,也同样比较方便。

七、选择语句

如果.........,那么..........

面临选择问题就是选择语句。可以看下面的if语句

int main( )
{int input = 0;printf("好好学习(1/0)?");scanf("%d",&input);if(input == 1)printf("OK\n");else if(input == 0)printf("NO\n");elseprintf("erro\n);return 0;
}

定义一个变量Input,让你选择0或者1,1的话会输出OK,0的话会输出NO,其它会输出erro,后续还会深入了解if语句,在这里只需要if语句其实就是个选择语句就可以。可以按自己的想法来实现选择分支。

八、循环语句

生活中有些事是一直在做的,比如吃饭,学习,走路。

代码也可以描述循环,循环也可以被打破。

C语言中有三种循环:

while 语句

for 语句

do... while 语句

 (1)while语句

int main( )
{int line = 0;while( ){printf("敲代码\n");line++;}if(line > 2000)printf("OK\n");elseprintf("NO\n");return 0;
}

这里就用了一个while循环语句,当条件符合的时候也就是line值小于2000的时候,会一直输出敲代码,line的值会一直增加,后续用一个if else语句来实现选择结构,如果大于2000,则输出OK,如果不符合则输出NO。

后续会持续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node-RED-L2-Node-RED在Linux系统启动时自动运行

Node-RED在Linux系统启动时自动运行 目的步骤1创建服务文件&#xff1a;2重新加载服务&#xff1a;3启用服务&#xff1a;4启动Node-RED服务&#xff1a;5检查服务状态&#xff1a;6其他说明7如果没启动正确的Node-RED执行路径&#xff1a;确保使用绝对路径&#xff1a; 检查用…

Flutter 约束布局

配置插件依赖 设置组件大小 通过属性 childConstraints 实现 分别设置 约束布局一 和 约束布局二 大大小为:160 和 200 点击查看代码文件 class SummaryPageState extends State<SummaryPage1> {ConstraintId constraintId_1 = ConstraintId(ConstraintId_1);Constrain…

易航网址导航系统V2.45完美去授权版

简介 易航网址导航系统V2.45完美去授权版 界面

Spring(看这一篇就够了)

Spring 概述 Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台&#xff0c;它最初是由 Rod Johnson 编写的&#xff0c;并且…

SFUD库移植

1.源码 GitHub - armink/SFUD: An using JEDECs SFDP standard serial (SPI) flash universal driver library | 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库 2.介绍 这个通用驱动库,实际就是帮你封装好了读写spiflash的函数, 我们只需要对接以下底层,就可以轻松…

【个人笔记】线程和线程池的状态以及转换方式

线程和线程池的状态是不一样的&#xff01;&#xff01; 线程有 6 种状态&#xff0c;查看Thread的State枚举类&#xff1a; NEW&#xff1a;创建后没启动的线程就处于这种状态RUNNABLE&#xff1a;正在java虚拟机中执行的线程就处于这种状态BLOCKED&#xff1a;受阻塞并等待…

Observability:构建下一代托管接入服务

作者&#xff1a;来自 Elastic Vishal Raj, Marc Lopez Rubio 随着无服务器&#xff08;serverless&#xff09;的引入&#xff0c;向 Elastic Cloud 发送可观察性数据变得越来越容易。你可以在 Elastic Cloud Serverless 中创建一个可观察性无服务器项目&#xff0c;并将可观察…

【Java】虚拟机(JVM)内存模型全解析

目录 一、运行时数据区域划分 版本的差异&#xff1a; 二、程序计数器 程序计数器主要作用 三、Java虚拟机 1. 虚拟机运行原理 2. 活动栈被弹出的方式 3. 虚拟机栈可能产生的错误 4. 虚拟机栈的大小 四、本地方法栈 五、堆 1. 堆区的组成&#xff1a;新生代老生代 …

Ubuntu磁盘不足扩容

1.问题 Ubuntu磁盘不足扩容 2.解决方法 安装一下 sudo apt-get install gpartedsudo gparted

Mysql梳理6——order by排序

目录 6 order by排序 6.1 排序数据 6.2 单列排序 6.3 多行排列 6 order by排序 6.1 排序数据 使用ORDER BY字句排序 ASC&#xff08;ascend&#xff09;:升序DESC(descend):降序 ORDER BY子句在SELECT语句的结尾 6.2 单列排序 如果没有使用排序操作&#xff0c;默认…

C语言课程设计题目一:职工信息管理系统设计

文章目录 题目一&#xff1a;职工信息管理系统设计代码块employeeManagement.hemployeeManage.ctest.c 调试验证录入信息&#xff0c;并浏览验证职工号唯一保存职工信息&#xff0c;加载职工信息按职工号进行查询根据id删除职工修改职工信息 题目一&#xff1a;职工信息管理系统…

下水道内缺陷识别检测数据集 yolo数据集 共2300张

下水道内缺陷识别检测数据集 yolo数据集 共2300张 下水道内部缺陷识别数据集&#xff08;Sewer Interior Defect Recognition Dataset, SIDRD&#xff09; 摘要 SIDRD 是一个专门针对下水道内部缺陷识别的数据集&#xff0c;旨在为城市基础设施维护和管理提供一个标准化的训练…

VmWare安装虚拟机保姆级教程(centos7,虚拟机网络设置,虚拟机桌面显示)

VMWare下载&#xff1a; 下载 VMware Workstation Pro - VMware Customer Connect 安装包&#xff1a;&#xff08;16的版本&#xff09;免费&#xff01;&#xff08;一个赞就行&#xff09; 一直点下一步即可&#xff0c;注意修改一下安装位置就好 二、安装虚拟机 安装虚…

论文复现:考虑电网交互的风电、光伏与电池互补调度运行(MATLAB-Yalmip-Cplex全代码)

论文复现:考虑电网交互的风电、光伏与电池储能互补调度运行(MATLAB-Yalmip-Cplex全代码) 针对风电、光伏与电化学储能电站互补运行的问题,已有大量通过启发式算法寻优的案例,但工程上更注重实用性和普适性。Yalmip工具箱则是一种基于MATLAB平台的优化软件工具箱,被广泛应用…

[uni-app]小兔鲜-02项目首页

轮播图 轮播图组件需要在首页和分类页使用, 封装成通用组件 准备轮播图组件 <script setup lang"ts"> import type { BannerItem } from /types/home import { ref } from vue // 父组件的数据 defineProps<{list: BannerItem[] }>()// 高亮下标 const…

【React】Ant Design 5.x版本drawer抽屉黑边问题

环境 antd: ^5.14.1react: ^18 问题情况 <Drawer open{open} closable{false} mask{false} width{680}getContainer{props.getContainer || undefined}><p>Some contents...</p><p>Some contents...</p><p>Some contents...</p> …

时序数据库 TDengine 的入门体验和操作记录

时序数据库 TDengine 的学习和使用经验 什么是 TDengine &#xff1f;什么是时序数据 &#xff1f;使用RPM安装包部署默认的网络端口 TDengine 使用TDengine 命令行&#xff08;CLI&#xff09;taosBenchmark服务器内存需求删库跑路测试 使用体验文档纠错 什么是 TDengine &…

OpenAI GPT o1技术报告阅读(2)- 关于模型安全性的测试案例

✨报告阅读&#xff1a;使用大模型来学习推理(Reason) 首先是原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 接下来我们看一个简单的关于模型安全性的测试&#xff0c;当模型被问到一个有风险的话题时&#xff0c;会如何思考并回答用户呢&…

C++ | Leetcode C++题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; struct Trie {// 左子树指向表示 0 的子节点Trie* left nullptr;// 右子树指向表示 1 的子节点Trie* right nullptr;Trie() {} };class Solution { private:// 字典树的根节点Trie* root new Trie();// 最高位的二进制位编号为 30static…

【linux】gcc makefile

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.gcc如何完成02.gcc选项03.函数库与动静态链接静态链接动态链接库文件特点和用途动态链接版本和兼容性 04.makefile自动推导 01.gcc如何完成 预处理(进行宏替换) 预处理功能主要…