C语言初阶_初识C语言(2)

news2024/11/23 23:14:03

我尝试用这博客记录下我所热爱
​我只不过是个无名小辈
​无休止地更新
​在名利中苦苦挣扎
​世事变幻莫测
​就算每一次早早被淘汰
​在失败边缘挣扎

我的数据结构与算法系列开始了,有一定C语言基础的同学可以去学习!

数据结构与算法_时间复杂度

有任何问题都可以私信我。

目录

变量的作用域和生命周期

变量的作用域

变量的生命周期

常量

字面常量const

const修饰的常变量

#define定义的标识符常量

枚举常量

字符串+转义字符

字符串

转义字符

选择语句

循环语句


变量的作用域和生命周期

变量的作用域

什么是作用域?

举个简单的例子,当我执行以下代码时:

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

可以得到预期的结果:

而当我执行下边的代码时:

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

会发现编译器会报错:

说明a在{}内部可以使用,但出了{}就不能用了。

通俗地讲,哪里可以使用它,哪里就是它的作用域。

现在定义一个全局变量,再定义一个函数,看看两个2022能不能都打印出来。

#include <stdio.h>
int g_a = 2022;
void test()
{
	printf("test:%d\n", g_a);
}
int main()
{
	printf("%d\n", g_a);
	test();
	return 0;
}

经调试发现得到了预期的结果。

过程如下:

如果我们执行以下代码:

#include <stdio.h>
void test()
{
	printf("test:%d\n", g_a);
}
int g_a = 2022;
int main()
{
	printf("%d\n", g_a);
	test();
	return 0;
}

会发现编译器会报错:

要解决问题,在开头的时候声明一下就好:

#include <stdio.h>
int g_a;
void test()
{
	printf("test:%d\n", g_a);
}
int g_a = 2022;
int main()
{
	printf("%d\n", g_a);
	test();
	return 0;
}

真正定义在后边,第一个只是声明。

也可以直接在代码开头定义。

要使用变量,一定要先声明再使用。

全局变量还可以这么用:

新建一个.c源文件,在里边定义一个变量,能否在一个.c文件中调用另一个.c文件里的变量呢?

 会发现编译器会报错:

这时候就要声明外部符号了!

在test.c中加上extern int g_a;

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

经调试得到了预期的结果:

 所以,全局变量的作用域是整个项目(工程)!

变量的生命周期

什么是变量的生命周期?

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

在之前我们演示过这样的代码的调用:

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

a并不能在printf中使用。

为什么不能?

就是因为局部变量在进入作用域时创建,一旦出了作用域就会销毁。销毁了就不能用了。

本质上是在变量创建时向内存申请一块空间,销毁时把这块空间还给内存。

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

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

只要程序还活着,全局变量就可以使用。

常量

会变的值是变量,恒不变的值是常量。

C语言中常量和变量的定义有所差异:

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

字面常量

const修饰的常变量

#define定义的标识符常量

枚举常量

这些常量都有自己的特点,要根据需求去选择。

字面常量const

字面常量可以这样定义:

int main()
{
	100;
	'a';
	3.141592653589;
    3.14;
    "hello world";
	return 0;
}

100是整型常量,a是字符型常量,3.141592653589是双精度浮点型常量,3.14是单精度浮点型常量,hello world是字符串常量。都是字面常量。

const修饰的常变量

为什么叫常变量?是因为它本质上是变量,但是不能通过某种方式改变。

这里仅仅点到为止,想仔细了解可阅读我先前的博客文章http://t.csdn.cn/PdCHE

比如我创建一个变量,在它前面加上const,然后想改变它的值,但发现编译器会报错:

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

 也就是说,它是变量,但有常量的部分属性。

#define定义的标识符常量

现在用#define给M定义100

#define M 100

这就是#define标识符常量的定义方法。

执行以下代码,会打印出100

#include <stdio.h>
#define M 100
int main()
{
	printf("%d",M);
	return 0;
}

枚举常量

枚举其实就是一一列举。

生活中有些值可以一一列举,如血型、性别、三原色等等。

如果想定义三原色,就要用到enum

#include <stdio.h>
enum COLOR
{
	RED,
	GREEN,
	BLUE
};
int main()
{

	return 0;
}

如果我想让c代表的颜色为红色,那就需要这样:

enum COLOR c = RED;

RED、GREEN和BLUE有其相对应的值吗?

执行以下代码:

#include <stdio.h>
enum COLOR
{
	RED,
	GREEN,
	BLUE
};
int main()
{
	printf("%d\n",RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	return 0;
}

可以发现它们的值分别是0、1、2。

更多常量相关的细节日后再讲。

字符串+转义字符

字符串

“hello world.\n"

这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。

注意!字符串的结束标志是一个 \0 的转义字符。

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

如果想存储一个字符,就要用字符型变量。

如果想存储多个字符或是字符串,就用到数组了。

比如,我想存储hello world,可以这样定义数组:

	char arr[] = "hello world";

注意,用字符串就要用字符型变量char。

也可以这样:

	char arr[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d','\0' };

这样存储字符串时,一定要以\0结尾!!!

如果去掉\0再去执行代码:

#include <stdio.h>
int main()
{
	char arr[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d'};
	printf("%s", arr);
	return 0;
}

会出现“烫”的字样。

是内存太烫了吗?......

为什么会出现这种情况?

调试以下代码,对arr1和arr2进行监视:

#include <stdio.h>
int main()
{
	char arr1[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d'};
	char arr2[] = "hello world";
	gets();//无实际意义,仅用于不让程序结束。
	return 0;
}

可以发现arr2比arr1多了\0。

arr2中的\0是隐藏的、自动补上的,我们看不到但它是实际存在的。而arr1中没有\0。

这是两种不同书写形式带来的差异。

上文已提到\0是字符串结束的标志。

%s是打印字符串。

在初始化arr1和arr2时会向内存分别申请一块空间,分别存放hello world和hello world\0。

在打印字符串的时候,一直要打印到\0才停止。

由于arr1中没有\0,那么将继续往后打印,与arr1相邻的内存空间中存放的是什么完全不知道,直至遇到\0为止。

所以就会看到乱码的现象。

 如果不想出现乱码,就要在arr1末尾手动加上\0

另外,计算字符串长度时,\0不算作字符串内容。

比如用常用库函数strlen(需要引用string.h头文件):

#include <stdio.h>
#include <string.h>
int main()
{
	int length = 0;
	char arr[] = "hello world";
	length = strlen(arr);
	printf("%d", length);
	return 0;
}

 strlen统计的是\0之前的字符串的个数。

转义字符

在屏幕上打印abcndef

	printf("abcndef");

而当我在n之前加上\的时候:

	printf("abc\ndef");

此时\n是转义字符换行符,不再是字符n。

假如我们要在屏幕上打印一个目录: c:\code\test.c

printf("c:\code\test.c\n");

实际上运行效果是这样的

这是因为t前边由于\的存在,t被转义了。

下边看一些转义字符:

 看一道笔试题:

int main()
{
    printf("%d\n", strlen("abcdef"));
    printf("%d\n", strlen("c:\test\628\test.c"));
    return 0;
}

程序会输出什么?

是6和14。

第一行打印很简单,第二行稍复杂。

首先\t会成为转义字符,那么接下来是\6成为转义字符?还是\62成为转义字符?还是\628成为转义字符?

是\62,因为根据上表,\ddd中ddd表示1~3个八进制的数字。

既然是八进制,那8就不能参与成为转义字符的一部分了。

为什么不是\6?因为三位之内的八进制数都可以成为转义字符的一部分。

还有就是,转义字符不管看起来长多少,都是一个字符的长度。

选择语句

如果你好好学习,校招的时候拿一个好offer,走上人生巅峰。

如果你不学习,毕业即失业,回家卖红薯!

这就是选择。

如果用C语言表达,是这样的:

#include <stdio.h>
int main()
{
    int input = 0;
    printf("你要好好学习吗?(1/0)\n");
    scanf("%d",&input);
    if (input == 1)
    {
        printf("好offer");
    }
    else if (input == 0)
    {
        printf("卖红薯");
    }
    else
    {
        printf("输入错误!");
    }
    return 0;
}

要么打印输出“好offer”,要么打印输出“卖红薯”,要么打印输出“输入错误!”,不可能两个或者三个同时执行。

C语言中if语句就是选择语句。

循环语句

生活中有很多事情需要我们日复一日甚至年复一年地去做,比如上课、学习。

你一直在学计算机,天天买彩票。

某天你买了张彩票,中了大奖,那你走上了人生巅峰(相对的,因为可能会有人看不上这奖)。

然后就迎娶白富美,学习?学什么习!

如果你天天买彩票都没中奖,你还会去老实学习,虽然是菜鸟,但是在坚持日复一日地学习。

直到有一天,你成为了大牛,你没有买彩票中奖,同样走上了人生巅峰。

C语言中有三种循环,分别是while语句、for语句和do...while语句。

今天只讲while语句,其他两个后期讲。

你选择了好好学习,然后日复一日地敲代码。

只有在敲够20000行代码(有意义的代码)后才能拿到好offer。

如果你没有敲够20000行,就日复一日地敲代码。

某天你敲够了20000行代码,恭喜!你拿到了好offer!

#include <stdio.h>
int main()
{
    printf("加入比特\n");
    int line = 0;
    while (line <= 20000)
    {
        line++;
        printf("我要继续努力敲代码\n");
    }
    if (line > 20000)
        printf("好offer\n");
    return 0;
}

如果你在学习过程中开始摆烂,没有敲够20000行代码,那就没有好offer了。

一定要满足line>20000的条件,否则会提示“好好学习,天天编程”。

#include <stdio.h>
int main()
{
    printf("加入比特\n");
    int line = 0;
    while (line <= 20000)
    {
        line++;
        printf("我要继续努力敲代码\n");
    }
    if (line > 20000)
        printf("好offer\n");
    else
        printf("好好学习,天天编程");
    return 0;
}

创作不易,码了五千多字,求各位老铁三连支持下!

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

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

相关文章

jmeter下载及安装配置

目录&#xff1a;导读 前言 jmeter环境 jmeter环境变量配置如下&#xff1a; &#xff08;1&#xff09;新增JMETER_HOME变量 &#xff08;2&#xff09;配置Path环境变量&#xff1a; &#xff08;3&#xff09;配置CLASSPATH变量&#xff0c;加上&#xff1a; &#xf…

计算机毕业设计——基于html智能家电购物商城项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【SpringMVC】使用篇:SpringMVC的开始

目录 一、前言 二、RequestMapping 三、params表达式 四、Ant风格资源地址 五、PathVariable 六、Rest风格的请求数据 七、请求映射数据 相关文章 【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程一、…

使用MMA解决拓扑优化问题的并行框架

使用MMA解决拓扑优化问题的并行框架 仅个人论文学习笔记。 本文的重点是用c实现的完全并行拓扑优化框架&#xff08;线性求解器和优化算法&#xff09;&#xff0c;将MMA(Method of Moving Asymptotes)优化算法并行化&#xff0c;作为代码的基本部分。 实现一个拓扑优化问题 在…

vitepress+gitee pages搭建自己的博客网站

概述 “不写博客的GISer不是一个好程序员”。所以&#xff0c;好多程序员会保留着写博客的习惯&#xff0c;一方面记录自己的学习成果或者解决某个问题的方法&#xff0c;一方面能够帮助到他人&#xff0c;再一方面也能够督促自己多学点东西……这是一个一举N得的事情。上为其…

【C语言进阶】怎么可能不会?十分钟带你玩转枚举与联合

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、枚举&#x1f95d;&#xff1a; 1.枚举类型的定义&#xff1a; 2.枚举类型的优点&#xff1a; 3.枚举类型的使用&#xff1a; &#x1f353;二、联合&#xff08;共用体&#xff09;&#x1f353;&#x…

【实验报告NO.000002】MIT 6.858 Computer System Security - Lab 3

0x03.Lab 3: Symbolic execution 本 lab 将教大家使用 符号执行 &#xff08;symbolic execution&#xff09; 这一强大的技术来寻找软件中的漏洞&#xff0c;在 lab 的最后我们将建立一个可以在 zoobar web 应用中寻找触发多种漏洞的符号执行系统&#xff08;准确的说是一个混…

基于主从博弈的电热综合能源系统动态定价与能量管理附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

你真的了解缓存吗?(2)

在上一篇文章你真的了解缓存吗?(1)中&#xff0c;我介绍了引入缓存的利与弊&#xff0c;以及在选择一款缓存中间件时应该注意什么。在这一篇文章中&#xff0c;我们继续介绍在不同的业务场景下&#xff0c;如何进行缓存的选择&#xff0c;具体来说就是缓存的分类&#xff0c;和…

嵌入式分享合集123

一、简易大功率变压器电路图 本文介绍的电子变压器克服了传统硅钢片变压器体积、重量大、效率低、价格高的缺点&#xff0c;电路成熟&#xff0c;性能稳定。 本电子变压器工作原理与开关电源相似&#xff0c;电路原理图见图1&#xff0c;由VD1-VD4将市电整流为直流&#xff0c…

书店管理系统(基于MySQL存储)

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

对标测评YD云电脑和天翼云电脑公众版

最近听说YD也推出了自研云电脑产品&#xff0c;抱着吃瓜心态网上充值体验了一把YD云电脑&#xff0c;正好我手上有天翼云电脑&#xff0c;凑一对测试看看两家央企在云计算领域的技术实力究竟如何。 测试环境搭建在我的个人pc上&#xff0c;分别下载YD云和天翼云电脑最新Windows…

[思维模式-3]:《如何系统思考》-3- 认识篇 - 什么是系统?系统的特征?

目录 第1章 什么是系统 1.1 万事万物都是一个有机的系统 1.2 系统的科学定义 1.3 系统的构成 1.4 系统的分类 第2章 动态复杂系统的八大特征 2.1 目的性 2.8 边界 2.3 结构影响行为 2.4 总体大于部分之和 2.5 因果互动 2.6 反馈 2.7 动态稳定性&#xff08;动态自…

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本

SAP ABAP 小工具 获取两个日期时间秒数和输出时间转换文本 引言&#xff1a; 小工具 获取两个日期时间秒数和输出时间转换文本&#xff0c;用于加强用户交互直观性。 关键字&#xff1a;SAP ABAP 日期时间间隔 秒数 转换时间文本 文章目录SAP ABAP 小工具 获取两个日期时间秒…

[附源码]Python计算机毕业设计Django吾悦商城管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

计算机毕业设计springboot+vue基本微信小程序的小区防疫监管系统

项目介绍 编写工具用idea 、Maven包,后端数据库是mysql,Java语言,springboot框架。其间,在健康打卡位置和物资选购要调用接口才可实现其功能。 1、研究对象&#xff1a;小区居民普通用户和小区管理员 管理员权限&#xff1a;管理员是整个系统的操作者,系统的各个模块都能进行信…

python中pandas进行数据分析与可视化(3)

1.创建数据源 在前几篇博客中&#xff0c;都是手动创建少量数据充当数据源&#xff0c;这次通过随机生成&#xff0c;让数据量多一些 # 导入所有需要的库 import pandas as pd import numpy.random as np import openpyxl import xlrd import matplotlib.pyplot as plt#创建一…

Python基础 - 本地模块的绝对导入/引用

目录 1. 项目入口文件 2. 绝对导入 Python本地模块的引入是比较简单的&#xff0c;包括绝对引用和相对引用(相对引用的博客参考下一篇Python基础 - 本地模块的相对导入/引用)&#xff0c;个人比较推荐使用绝对引用&#xff0c;会避免掉很多错误&#xff0c;本篇文章主要介绍绝…

【Javassist】快速入门系列01 使用Javassist实现Hello World

系列文章目录 01 使用Javassist实现Hello World 文章目录系列文章目录前言引入Javassist jar包使用Javassist实现Hello World总结说明前言 本篇文章为Javassist入门系列文章&#xff0c;适合了解Java基础语法的人零基础学会使用Javassist实现一个Hello World程序。 引入Javas…

国企招聘: 中国雄安集团2023校园招聘,面向全国,不限户籍

中国雄安集团有限公司2023年校园招聘公告 中国雄安集团有限公司&#xff08;以下简称“中国雄安集团”&#xff09;成立于2017年7月18日&#xff0c;是雄安新区开发建设的主要载体和运作平台。结合雄安新区建设需要&#xff0c;中国雄安集团布局金融与投资、城市发展与城市资源…