【C语言次列车ing】No.1站---C语言入门

news2024/11/23 23:41:32

文章目录

  • 前言
  • 一、什么是C语言
  • 二、第一个C语言程序
  • 三、数据类型
  • 四、变量、常量
  • 五、字符串+转义字符+注释


前言

在这里插入图片描述

👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:C语言次列车ing
🔑本章内容:数据类型、变量+常量、字符串+转义字符+注释
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是C语言

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。

C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

C语言中有哪些单位?
byte - 字节1 byte=8 bit
KB1 KB=1024 byte
MB1 MB=1024 KB
GB1 GB=1024 MB
TB1 TB=1024 GB
PB1 PB=1024 TB
bit比特位

二、第一个C语言程序

stdio.h 标准输入输出头文件
#include<stdio.h>
//C语言的代码都是main函数的第一行开始执行的
main函数是程序的入口  ---  但是有且仅有一个
int main()
{
	printf("hello world\n");
	//printf是一个库函数---C语言的标准库中提供的一个现成的函数
	//功能:在屏幕上打印信息
	//输出函数,打印函数,使用前一定要包含头文件stdio.h
	return 0;
}

三、数据类型

char (字符数据类型)%c用来输出字符,char型;%s用来输出字符串,通常用来输出char型
short (短整型)%d
int (整形)%d整型输出,通常用来输出int型
long (长整型)%ld长整型输出,通常用来输出long型
long long (更长的整形)%lld更长整形输出,通常用来输出long long 型
float (单精度浮点数)%f用来输出小数,通常用来输出float型
double (双精度浮点数)%lf是双精度浮点型,通常用来输出double型
1. 为什么出现这么的类型和研究它的大小?
  • 存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
    类型的使用:
注意:字符必须要单引号引起来
char ch = 'w';
double weight = 120.0;
int salary = 20000;

请添加图片描述
请添加图片描述

  • 假设有一个数字20想要将它存到内存中,那应该申请多大空间呢?
    首先20是一个整形,申请一个int 类型的空间就可以了,只要申请4个字节的空间把它放进去就可以啦也就是为什么研究类型大小
2. 每种类型的大小是多少?
#include<stdio.h>
int main()
{
	sizeof - 运算符(操作符)
	单位字节
	printf("%d\n", sizeof(char));
	printf("%d\n", sizeof(short));
	printf("%d\n", sizeof(int));
	C语言标准:sizeof(long)>=sizeof(int)
	printf("%d\n", sizeof(long));
	printf("%d\n", sizeof(long long));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
	return 0;
}

请添加图片描述

四、变量、常量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

1. 定义变量的方法
#include<stdio.h>
int main()
{
	int num = 20;
	char ch = "b";
	float weight = 45.5f;
	编译器默认认为一个小数就是double所以可以在末尾加个f
	return 0;
}


#include<stdio.h>
int main()
{
	int num = 10;
	printf("%d\n", num);
	num = 20;
	printf("%d\n", num);
	return 0;
	通过下述图片可以主观的看到num是可变的是一个变量
}

请添加图片描述

2. 变量的命名
  • 只能由字母(包括大写和小写)、数字和下划线( _ )组成
  • 不能以数字开头
  • 长度不能超过63个字符
  • 变量名中区分大小写的(Num和num是不一样的)
  • 变量名不能使用关键字
  • 变量名最好有意义(比如年龄:int age)
3. 变量的分类

变量是有分类的:

  • 局部变量:在{}内部定义的变量就是局部变量
  • 全局变量:在{}外部定义的变量就是全局变量

🌟局部变量

#include<stdio.h>
int main()
{
	int a = 10;//限制在main函数内部是一个局部变量
	printf("%d\n", num);
	return 0;
}

🌟全局变量

int num = 100;//全局变量
#include<stdio.h>
int main()
{
	printf("%d\n", num);
	return 0;
}

🌟局部变量与全局变量的易错点

int a = 1000;
#include<stdio.h>
int main()
{
	int a = 10;
	//int a = 20;//同一个范围内出现两个局部变量就会冲突
	printf("%d\n", a);全局变量和局部变量的名字可以相同但是在使用时局部变量优先
	所以下述打印出来是10而不是1000
	return 0;
}

请添加图片描述
🌟变量的使用

计算两个数值相加
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int num1 = 0;//创建了两个变量
	int num2 = 0;
	//scanf 是一个输入函数
	scanf("%d %d", &num1, &num2);
	int sum = 0;
	sum = num1 + num2;
	printf("%d\n", sum);
	return 0;
}

请添加图片描述

4. 变量的作用域和声明周期

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

  • 局部变量的作用域是变量所在的局部范围。
#include<stdio.h>
void test()
{
	printf("%d\n", a);
}
int main()
{
	int a = 10;
	printf("%d\n", a);
	{
		int b = 20;//b在{ }内部,它的作用域就是{ }内部,出了作用域就不可以用了
		printf("%d\n", b);
	}
	printf("%d\n", b);
	return 0;
}

在这里插入图片描述

  • 全局变量的作用域是整个工程
#include<stdio.h>
int a = 100;
void test()
{
	printf("2: %d\n", a);
}
int main()
{
	printf("1: %d\n", a);
	test();
	return 0;
}



//声明外部符号
extern int g_val;

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

在这里插入图片描述
在这里插入图片描述

这也证明了全局变量是不安全的因为使用的范围比较广谁都可以用,也就代表潜在危险大
extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

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

  • 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
#include<stdio.h>
int main()
{
	{
		int a = 10;
		printf("%d\n", a);
	}
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

  • 全局变量的生命周期是:整个程序的生命周期
#include<stdio.h>
int a = 10;
void test()
{
	printf("%d\n", a);
}
int main()
{
	//...
	test();
	return 0;
}
5. 常量

C语言中的常量和变量的定义的形式有所差异。
C语言中的常量分为以下以下几种:

  • 字面常量
#include<stdio.h>
int main()
{
	字面常量
	100;整形字面值
	"w";字符字面值
	3.14;浮点型字面值
	"abcdef";字符串常量
	return 0;
}
  • const 修饰的常变量
#include<stdio.h>
int main()
{
	const 是常属性不能被改变
	
	const int num = 10;    num本质上是个变量,但是具有了常属性不能被修改
	printf("%d\n", num);
	//num = 20;              
	不能被改变了    
	printf("%d\n", num);

	怎么证明num本质上还是个变量呢?
	用数组试验一下:
	//const int n = 10;
	//int arr[n] = { 0 };
	
	n虽然被const修饰具有了常属性不能被修改但本质上还是变量不能用来指定数组大小
	
	int arr[10] = { 0 };

	下述代码在支持C99的编译器上是可以编译的,C99中引入了变长数组的概念
	变长数组的大小是可以使用变量来指定的,但是数据不能初始化
	//int n = 10;
	//int arr[n];
	return 0;
}
  • #define 定义的标识符常量(不是常变量)
#define MAX 1000
#include<stdio.h>
int main()
{
#define MIN 200
	printf("%d\n", MAX);
	printf("%d\n", MIN);
	int arr[MAX];
	return 0;
}

请添加图片描述

  • 枚举常量
enum Sex
{
	下面三个符号是Sex这个枚举类型的未来的可能取值
	MALE=5,         赋初始值
	FEMALE=8,       不赋值就是上面递增1
	SECRET          不赋值就是上面递增1
};
int main()
{
	enum Sex s=FEMALE;
	//默认取值
	printf("%d\n", MALE); 1
	printf("%d\n", FEMALE);2
	printf("%d\n", SECRET);3
	//MALE=5;
	枚举常量不能被改
	return 0;
}

在这里插入图片描述
在这里插入图片描述

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

1. 字符串
"hello world.\n"

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容

#include<stdio.h>
int main()
{
	C语言表示字符用单引号引起来例如:'a'   'w'   '1' 
	多个字符组成的一串字符称为字符串
	C语言表示字符串由双引号引起啦例如:"abcdef"  "www"

	"abc"  ---> a b c \0     其中\0作为这个字符串的结束标志
	char ch1 = 'a';
	char ch2 = 'b';
	//字符数组
	char arr[]括号里没有指定大小是因为给它赋值初始化了,大小就不用指定了,编译器会根据初始化内容确认数组的大小
	
	char arr1[] = "abc";
	arr1里面放了四个字符 a b c \0
	
	char arr2[] = { 'a','b','c' };
	arr2里面只放了三个字符 a b c
	
	return 0;
}

在这里插入图片描述
🌟那如何验证\0是字符串的结束标志呢

#include<stdio.h>
int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	%s --- 打印字符串,直到\0才终止打印
	%c --- 打印字符
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

在这里插入图片描述

用%s打印arr1的时候遇到\0,而\0是字符串的结束标志,然后就不打印了,所以打印的是abc;但是arr2中放的abc没有\0,没有结束标志,所以用%s打印的时候就会依次往后找,找到\0这个结束标志打印停止,但是后面是什么我们根本不知道,所以打印的是随机值

#include<stdio.h>
int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	
	当主动放进去一个\0就不会出现arr2的情况
	char arr3[] = { 'a','b','c','\0' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

在这里插入图片描述
🌟补充一个知识点:strlen是一个库函数,专门用来求字符串长度(统计的是\0之前出现的字符的个数),使用时要包含头文件#include<string.h>

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	char arr3[] = { 'a','b','c','\0' };
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);

	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	printf("%d\n", strlen(arr3));
	char len = strlen("abcdef");
	
	strlen 在求字符串长度的时候,统计的是\0之前出现的字符的个数
	
	printf("%d\n", len);
	return 0;
}

请添加图片描述
在这里插入图片描述

2. 转义字符
转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示字符常量’
\“用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符。
\0字符串的结束标志
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0
程序输出什么?
#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));
    
    \62被解析成一个转义字符
    
    \ddd, ddd表示1~3个八进制的数字(0~7没有8)
    printf("%d\n", strlen("c:\test\628\test.c"));
    \628中有8说明不是八进制的数字
    return 0;
}

在这里插入图片描述

3. 注释
  • 代码中有不需要的代码可以直接删除,也可以注释掉
  • 代码中有些代码比较难懂,可以加一下注释文字

注释有两种风格:

  • C语言风格的注释 /xxxxxx/
    缺陷:不能嵌套注释
  • C++风格的注释 //xxxxxxxx
    可以注释一行也可以注释多行
#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;
}

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

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

相关文章

考研王道强化阶段(二轮复习)“算法题”备考打卡表 记录

问题&#xff1a;做408真题_2010_42题&#xff0c;即王道书 2.2.3_大题_10 思路&#xff1a; 回头补 代码&#xff1a; int moveL(SqlList &L,SqlList &S,int p) {// 健壮性表达if( L.len 0 ){return 0;}// 调用另外一个顺序表存储pos前面的元素for( int i0;i<p;…

【模型压缩】模型剪枝模块

模型剪枝模块 最基本的基于阈值策略 基于分布来选择阈值 假定权重是符合一个正太分布正态分布有68% 小于标准差 将标准差作为阈值卷积层的敏感度要比全连接层更大&#xff1a;导致有些层over-pruning 有些层 under-pruning 设置预期的稀疏率 权重值按照绝对值进行排序从最小…

字符串函数与内存函数讲解

文章目录 前言一、字符串函数1.求字符串长度strlen 2.长度不受限制的字符串函数(1)strcpy(2)strcat(3)strcmp 3.长度受限制的字符串函数(1)strncpy(2)strncat(3)strncmp 4.字符串查找(1)strstr(2)strtok 5.错误信息报告(1)strerror(2)perror 二、内存函数1.memcpy2.memmove3.me…

山西电力市场日前价格预测【2023-10-02】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-02&#xff09;山西电力市场全天平均日前电价为355.35元/MWh。其中&#xff0c;最高日前电价为521.18元/MWh&#xff0c;预计出现在18: 45。最低日前电价为309.36元/MWh&#xff0c;预计…

【C语言深入理解指针(2)】

1. 数组名的理解 在上⼀个博客我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#x…

Windows驱动反调试的一种手段

Windows驱动反调试的一种手段 今天要介绍的是eprocess的0xbc位置 0x0bc DebugPort : Ptr32 Void DebugPort是在用windowsapi调试方式时候所使用的数据结构指针&#xff0c;那么如果我们能够循环清空这个值的话&#xff0c;就可以做到大部分windows调试api都无法正确调试进程 …

机器学习算法基础--聚类问题的评价指标

1.聚类问题指标评价的意义 聚类算法是非监督学习最常用的一种方法&#xff0c;性能度量是衡量学习模型优劣的指标&#xff0c;也可作为优化学习模型的目标函数。聚类性能度量根据训练数据是否包含标记数据分为两类&#xff0c;一类是将聚类结果与标记数据进行比较&#xff0c;称…

【Axure】常见元件、常用交互效果

产品结构图 以微信为例&#xff0c;根据页面层级制作 动态面板 动态面板的作用&#xff1a;动态面板是一个可视区域&#xff0c;如果要把控件放进去&#xff0c;要全部放进去&#xff0c;放多少显示多少 文本框 隐藏边框方法&#xff1a;先拉一个矩形&#xff0c;去掉部分…

uniapp项目实践总结(二十五)苹果 ios 平台 APP 打包教程

导语:当你的应用程序开发完成后,在上架 ios 应用商店之前,需要进行打包操作,下面就简单介绍一下打包方法。 目录 准备工作注册账号生成证书打包配置准备工作 在打包之前,请保证你的 uniapp 应用程序编译到 ios 模拟器或者是真机调试基座环境下是可以正常运行的,苹果打包…

记录一次阿里云服务器ECS上启动的portainer无法访问的问题

如下图&#xff0c;在阿里云ECS服务器上安装并启动了portainer&#xff0c;但是在自己电脑上访问不了远程的portainer。 最后发现是要在网络安全组里开放9000端口号&#xff0c;具体操作如下&#xff1a; 在云服务器管理控制台点击左侧菜单中的网络与安全-安全组&#xff0c;然…

国庆day2---select实现服务器并发

select.c&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr,"__%d__:",__LINE__);\perror(msg);\ }while(0)#define IP "192.168.1.3" #define PORT 8888int main(int argc, const char *argv[]) {//创建报式套接字socketi…

Java笔记五(数组)

目录 数组 数组声明创建 数组初始化的三种初始化类型&#xff1a; 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 数组边界 数组的使用 示例一&#xff1a;计算所有的元素和以及查找最大元素 示例二&#xff1a;For-Each循环 示例三&#xff1a;数组作…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

【论文笔记】SVDM: Single-View Diffusion Model for Pseudo-Stereo 3D Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2307.02270 1. 引言 目前的从单目相机生成伪传感器表达的方法依赖预训练的深度估计网络。这些方法需要深度标签来训练深度估计网络&#xff0c;且伪立体方法通过图像正向变形合成立体图像&#xff0c;会导致遮挡区域的像素伪影、扭…

初识Java 12-1 流

目录 Java 8对流的支持 流的创建 随机数流 int类型的区间范围 generate() iterate() 流生成器 Arrays 正则表达式 本笔记参考自&#xff1a; 《On Java 中文版》 ||| 流的概念&#xff1a;流是一个与任何特定的存储机制都没有关系的元素序列。 流与对象的成批处理有关…

CSP-J第二轮试题-2021年-3题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 网络连接题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 样例 #4样例输入 #4样例输出 #4 提示答案1答案2 现场真题注意事项 参考&#xff1a; https://www…

使用 MyBatis 进行批量插入操作

使用 MyBatis 进行批量插入操作 批量插入是在数据库中同时插入多条记录的操作&#xff0c;通常用于提高数据插入的效率&#xff0c;特别是在需要大量数据导入或初始化时。MyBatis是一款流行的Java持久层框架&#xff0c;它提供了简单而强大的方式来执行批量插入操作。本文将介…

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 &#x1f34e; 为什么要学习非线性结构 ---- 树&#xff08;Tree&#xff09; &#x1f4a6; 线性结构的优缺点 &#x1f4a6; 优化方案 ----- 树&#xff08;Tree&#xff09; &#x1f4a6; 树的讲解流程 二、树的概念及结构 &#x1f350; 树的概念 &…

vue + openlayer 按路径移动

示例 创建一个方形的规矩&#xff0c;并让点按轨迹移动。效果如下: 源代码 <template><div><div id"map" class"map"></div><button id"start-animation" ref"startButton">Start Animation</bu…

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作

【Python】基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 文章目录 手势识别人脸追踪键盘控制整体代码附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 视频&#xff1a; 基于OpenCV人脸追踪、手势识别控制的求实之路FPS游戏操作 手…