news 2026/4/27 10:31:01

从变量到类型,搭建你的第一个C程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从变量到类型,搭建你的第一个C程序


个人主页: 流年如夢

专栏: 《C语言》

文章目录

  • 一数据类型介绍
    • 1.思维导图
    • 2.类型介绍
  • 二.了一下解`signed`和`unsigned`
  • 三.数据类型的取值范围
    • 1.整型(integer)
    • 2.浮点型(Floating-Point)
    • 3.取值范围的计算方法
    • 4.代码验证取值范围
  • 四.变量
    • 1.变量的定义
    • 2.数据类型
    • 3.变量的命名规则
    • 4.全局变量和局部变量
  • 五.了解操作符
    • 1.算术操作符
    • 2.赋值操作符
    • 3.单目操作符
  • 六.强制类型转换
  • 七.scanf和printf的介绍
  • 八.ASCLL码表参考

一数据类型介绍

1.思维导图

2.类型介绍

字符型char[signed]unsigned char("signed"为有符号整数类型)
短整型short[signed] shortunsigned short
整型:int[signed] intunsigned int
长整型long[signed] longunsigned long
长长整型longlong[signed] long longunsigned long;
浮点型floatdoublelong doouble
布尔类型_Bool(头文件为stdbool.h

简单布尔类型代码示意#include<stdio.h>#include<stdbool.h>intmain(){bool flag=true;if(flag){printf("I Love C\n");}return0;}

其中,布尔类型变量的取值为truefalsetrue=1,为真;false=0,为假,通过两者来判断。

关于数组、结构体、枚举等作者会在学完后进行整理逻辑在发😊

二.了一下解signedunsigned

在 C 语言中,signedunsigned是用于修饰整数类型的关键字,主要区别在于如何表示负数以及取值范围。

1. 有符号类型(signed
有符号类型能够表示正数、负数以及零。它借助二进制的最高位(也就是符号位)来确定数值的正负。当符号位为 0 时,表示这个数是正数;当符号位为 1 时,则表示这个数是负数。
常见的有符号类型:像intshortlong等。
表示范围:以 8 位有符号整数为例,其表示范围是-128 到 127(即 -2⁷ 到 2⁷ - 1)

2. 无符号类型(unsigned
无符号类型只能表示正数和零,因为它没有符号位,所有的二进制位都用来表示数值的大小。
常见的无符号类型:例如unsigned intunsigned shortunsigned char等。
表示范围:同样以 8 位无符号整数来说,它的表示范围是0 到 255(也就是 0 到 2⁸ - 1)

代码示例:#include<stdio.h>intmain(){// 有符号整数(默认)intsigned_num=-10;unsignedintunsigned_num=10;// 赋值超出范围(会发生溢出)signedcharchar1=127;// 有符号char范围: -128 ~ 127unsignedcharchar2=255;// 无符号char范围: 0 ~ 255// 溢出测试char1=char1+1;// 127 + 1 → -128(有符号溢出)char2=char2+1;// 255 + 1 → 0(无符号溢出)// 打印结果printf("有符号整数: %d\n",signed_num);printf("无符号整数: %u\n",unsigned_num);printf("有符号字符溢出: %d\n",char1);printf("无符号字符溢出: %u\n",char2);// 比较操作(隐式转换)if(-5>(unsignedint)5){printf("-5 大于 5(无符号比较)\n");}else{printf("-5 小于 5(无符号比较)\n");}return0;}

最后运行结果:

隐式类型转换规则
当有符号数与无符号数比较时,C语言会将有符号数隐式转换为无符号数,转换规则为:
若有符号数的值为负数,则通过补码规则转换为无符号数(即视为一个非常大的正数);
若为正数,则直接转换为对应无符号数(值不变)。

通过类型转换规则可知,-5在比较时被视为4294967291,因此大于无符号数5。
所以要避免混合类型比较,同时也要理解补码机制。

(可以上网了解一下相关知识)

三.数据类型的取值范围

1.整型(integer)

类型关键字存储空间有符号取值范围无符号取值范围
短整型short2字节− 32768 32767 -32768 ~ 327673276832767− 2 15 2 15 − 1 -2^{15} ~ 2^{15}-121521510 65535 0 ~ 655350655352 16 − 1 2^{16}-12161
整型int4字节− 2147483648 2147483647 -2147483648 ~ 214748364721474836482147483647− 2 31 2 31 − 1 -2^{31} ~ 2^{31}-123123110 4294967295 0 ~ 4294967295042949672952 32 − 1 2^{32}-12321
长整型long4/8字节− 2147483648 2147483647 -2147483648 ~ 214748364721474836482147483647(多数系统)0 4294967295 0 ~ 429496729504294967295(多数系统)
长整型(C99)long long8字节− 9223372036854775808 9223372036854775807 -9223372036854775808 ~ 922337203685477580792233720368547758089223372036854775807− 2 63 2 63 − 1 -2^{63} ~ 2^{63}-126326310 18446744073709551615 0 ~ 184467440737095516150184467440737095516152 64 − 1 2^{64}-12641
字符型char1字节− 128 127 -128 ~ 127128127(有符号)0 255 0 ~ 2550255(无符号)

2.浮点型(Floating-Point)

类型关键字存储空间数值范围有效数字位数
单精度型float4字节±1.2×10⁻³⁸ ~ ±3.4×10³⁸6~7位
双精度型double8字节±2.3×10⁻³⁰⁸ ~ ±1.8×10³⁰⁸15~16位
长双精度型long double8/16字节更高范围(依赖系统,如 ±1.2×10⁻⁴⁹³² ~ ±1.1×10⁴⁹³²)18~19位(部分系统)

3.取值范围的计算方法

(1). 无符号类型:
范围为 0 到 2^n - 1(n 为位数)。
例如:unsigned char(8 位)的范围是 0 到 255(即 2^8 - 1)。
(2). 有符号类型:
采用补码表示,范围为 -2^(n-1) 到 2^(n-1) - 1。
例如:int(32 位)的范围是 -2^31 到 2^31 - 1。

4.代码验证取值范围

可以使用 <limits.h> 和 <float.h> 头文件中的宏来获取具体平台的取值范围:

#include<stdio.h>#include<limits.h>// 整数类型限制#include<float.h>// 浮点类型限制intmain(){// 整数类型范围printf("char 范围: %d 到 %d\n",CHAR_MIN,CHAR_MAX);printf("unsigned char 范围: 0 到 %u\n",UCHAR_MAX);printf("int 范围: %d 到 %d\n",INT_MIN,INT_MAX);printf("unsigned int 范围: 0 到 %u\n",UINT_MAX);// 浮点类型范围printf("float 最小正值: %e\n",FLT_MIN);printf("float 最大正值: %e\n",FLT_MAX);printf("double 最小正值: %e\n",DBL_MIN);printf("double 最大正值: %e\n",DBL_MAX);return0;}

其对应的值:

四.变量

1.变量的定义

变量定义需要指定变量的数据类型和变量名,还可以对变量进行初始化。例如:intnum = 10; 定义了一个名为num的整型变量,并初始化10

2.数据类型

(1).基本数据类型:包括整型(int短整型(short长整型(long字符型(char单精度浮点型(float双精度浮点型(double等。不同的数据类型占用不同的存储空间,具有不同的取值范围和精度。

(2).派生数据类型:通过对基本数据类型进行组合或修饰得到,如数组、指针、结构体、联合体、枚举等。例如,数组是一组相同类型元素的集合,intarr[5]; 定义了一个包含 5 个整型元素的数组

3.变量的命名规则

(1).变量名只能由字母、数字和下划线组成。
(2).不能以数字开头
(3).不能使用 C 语言的关键字作为变量名。
(4).变量名应具有描述性,以便于理解其用途。

4.全局变量和局部变量

全局变量特点:
(1).作用域覆盖整个程序,也就是说,程序里的任何函数、类或者代码块都能够对其进行访问。
(2).生命周期和程序的运行周期是一样的,程序开始运行时它就被创建,程序结束运行时它才会被销毁。
(3).不过要注意,过度使用全局变量会让代码之间的耦合度提高,使程序的可维护性变差,所以在使用时要谨慎。

局部变量特点(在函数、类或者代码块的内部定义的):
(1).只能在定义它的那个函数、类或者代码块内部被访问外部无法访问
(2).当函数、类或者代码块执行完毕后,局部变量就会被销毁,它的生命周期比较短
(3).局部变量可以和全局变量使用相同的名称,在这种情况下,局部变量会暂时覆盖全局变量。(所以要避免两者使用相同的名称 (●’◡’●) )

值得注意的是,局部变量优先全局变量!!!
(不要问为什么,问就是作者已经长记性了😂)

简单示意图

#include<stdio.h>intnum2=753;//全局变量intmain(){intnum1=144;//局部变量printf("%d\n",num1);printf("%d\n",num2);return0;}

五.了解操作符

1.算术操作符

常见类型有:
加法(+):两数相加,如 3+5=8 。
减法(-):两数相减,如 7-2=5 。
乘法(×*):两数相乘,如 4×3=12 (代码中用 * )。
除法(÷/):两数相除,如 8÷2=4 (代码中用 / )。
取余(%):求除法余数,如 10%3=1 。
幂运算(^**):求指数,如 2^3=8 (代码中用**)。

简单示例#include<stdio.h>intmain(){inta=2,b=3;intc1,c2,c3,c4,c5,c6;c1=a+b;c2=a-b;c3=a*b;c4=a/b;//结果取商c5=a%b;//结果取模(余)c6=a^b;printf("c1 = %d\nc2 = %d\nc3 = %d\nc4 = %d\nc5 = %d\nc6 = %d\n",c1,c2,c3,c4,c5,c6);return0;}

最后运行结果

2.赋值操作符

赋值操作符用于将值赋给变量,是编程中最基础的操作之一。

常见赋值操作符:

基本赋值=

将右侧值赋给左侧变量,如 a=10 (将 10 赋给变量 a )。

复合赋值(简化运算赋值)

加法赋值(+=): a+=5 等价于 a=a+5 。
减法赋值(-=): b-=3 等价于 b=b-3 。
乘法赋值(*=): c*=2 等价于 c=c*2 。
除法赋值(/=): d/=4 等价于 d=d/4 。
取余赋值(%=): e%=3 等价于 e=e % 3 。
幂运算赋值(**=): f**=2 等价于 f=f**2 。

作用:

(1).简化代码,提升可读性,尤其在需要多次更新变量值的场景中(如循环累加)。

(2).不同编程语言中可能支持更多复合操作符(如位运算赋值),需结合具体语言规则使用。

简单示例#include<stdio.h>intmain(){inta=5,b=6,c=7,d=8,e=9,f=10;a+=11;b-=12;c*=13;d/=14;e%=15;f^=16;printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d\n",a,b,c,d,e,f);return0;

最后运行结果

3.单目操作符

单目操作符是只操作 一个操作数 的运算符,常见类型及功能如下:

常见单目操作符

(1).逻辑非(!)

对布尔值取反:!true结果为false!false结果为true

简单示例#define_CRT_SECURE_NO_WARNINGS//由于scanf在vs会报错(vs用的是scanf_s),所以可以在代码最顶端加入这行代码#include<stdio.h>intmain(){intnum;// 提示用户输入一个整数printf("请输入一个整数: ");scanf("%d",&num);// 使用逻辑非运算符判断if(!num){printf("你输入的是0,取反后为真(非零)。\n");}else{printf("你输入的是非零值(%d),取反后为假(0)。\n",num);}return0;}

最后运行结果分别为

(2).取反(-)

对数值取相反数: -5 结果为 5 , -(-3) 结果为 3 。

#include<stdio.h>intmain(){doublenum;// 输入一个数值printf("请输入一个数值: ");scanf("%lf",&num);// %lf用于读取double类型// 计算并输出相反数printf("该数值的相反数是: %.2lf\n",-num);//.2的意思是保留小数点后两位return0;}

(3).按位取反
在 C 语言里,按位取反操作符是~,其作用是对一个二进制数的每一位进行取反操作,也就是将 0 变为 1,将 1 变为 0。
基础概念
操作符符号:~
功能:对操作数的二进制位逐一取反
操作数类型:整型(像int、char这类)
本质:把每一位的状态进行翻转

运算规则
对二进制数的每一位执行取反操作:
0 取反后变成 1
1 取反后变成 0

原码、反码、补码的转换
在计算机内部,负数采用补码形式存储,因此按位取反的计算要结合补码规则来理解:
1.原码:直接用二进制表示数值,最高位作为符号位(0 代表正数,1 代表负数)
2.反码:正数的反码和原码相同负数的反码是在原码的基础上,符号位保持不变,其余位取反
3.补码:正数的补码与原码一样;负数的补码是其反码加 1。(正数则减1)
计算公式
对整数x进行按位取反操作,结果为-(x+1)
举例如下:
若x = 5,那么~x = -6
若x = -3,则~x = 2

对正数按位取反示例#include<stdio.h>intmain(){inta=5;//二进制:0000 0000 0000 0101(假设为32位整数)intb=~a;//按位取反:1111 1111 1111 1010(补码形式)printf("~%d = %d\n",a,b);//输出:~5 = -6return0;}/*计算步骤: 1. 5的原码是0000 0101。 2. 按位取反后得到1111 1010(这是补码形式)。 3. 补码1111 1010转换为原码: 先减 1,得到反码1111 1001。 再取反(符号位不变),得到原码1000 0110,其值为-6。*/

(4).自增(++)

变量值加 1,分 前置( ++a )和 后置( a++ ):

前置:先自增,再使用变量值。

后置:先使用变量值,再自增。

#include<stdio.h>intmain(){intx=5;inta=++x;// x变为6,a的值为6(前置)intb=x++;// x变为7,b的值为6(后置)printf("a = %d\nb = %d\n",a,b);return0;}

(5).自减(–)

变量值减 1,分 前置( --a )和 后置( a-- ),逻辑与自增类似。

(6).求字节数(sizeof)
在 C 语言中,sizeof是用于计算数据类型或变量占用内存字节数的操作符。
一、基本概念
1.作用
返回数据类型、变量或表达式占用的内存字节数(以字节为单位)。
结果类型为size_t(无符号整数类型)。

语法sizeof(类型名);// 计算类型的大小sizeof(表达式);// 计算表达式结果类型的大小sizeof表达式;// 省略括号(变量或常量表达式)
#include<stdio.h>intmain(){// 基本数据类型printf("char: %zu 字节\n",sizeof(char));printf("short: %zu 字节\n",sizeof(short));printf("int: %zu 字节\n",sizeof(int));printf("long: %zu 字节\n",sizeof(long));printf("long long: %zu 字节\n",sizeof(longlong));printf("float: %zu 字节\n",sizeof(float));printf("double: %zu 字节\n",sizeof(double));printf("long double: %zu 字节\n",sizeof(longdouble));return0;}


对于数组、指针等字节长度后续相关文章会发

(7).类型转换(强制类型转换)

将操作数转换为指定类型,如 (int)3.9 (C语言中转为整数 3 )。

(8).指针操作&*(这里简单了解一下)

解引用(*):获取指针指向的值。

取地址(&):获取变量的内存地址。

#include<stdio.h>intmain(){intx=10;int*ptr=&x;printf("%d",*ptr);// 输出10return0;}

特点

操作数唯一:仅作用于一个变量或值。

优先级较高:通常高于双目操作符(如加减乘除)。

语言差异:不同编程语言支持的单目操作符可能不同(如 Python 无 ++/-- ,但有 +/- 符号操作)。

理解单目操作符的逻辑和使用场景,能有效简化代码逻辑(如计数、状态切换等)。

六.强制类型转换

强制类型转换是将变量或表达式从一种数据类型显式转换为另一种数据类型的操作,常用于需要统一数据类型的场景。

常见方式(C语言)
1.显式类型转换(语法格式因语言而异)

2.转换规则与注意事项

(1).数值类型转换:
大范围转小范围(如intbyte)可能丢失精度或溢出。
浮点转整数通常会截断小数部分(如 5.9 → 5 )。

(2).布尔值转换:
非零数值、非空字符串等通常转为true0nullundefined等转为false

(3).字符串与数值互转:
字符串需符合数值格式(如 “123” 可转, “abc” 会报错)。

七.scanf和printf的介绍

最后我们再简单了解一下scanf(输入函数)和printf(输出函数)
scanfprintf是 C 语言中常用的输入输出函数,用于实现程序与用户的交互。以下是简单介绍:

关于printf

printf:格式化输出函数

功能:将数据按指定格式输出到控制台(或标准输出设备)。

语法printf("格式控制字符串",输出项1,输出项2,·····);

1.格式控制字符串:

普通字符:直接输出的文本(如 “Hello, World!” )。

格式说明符:指定输出数据的类型和格式,以%开头,常见示例:

%d:输出整数(如%d对应int类型)。
%f:输出浮点数(默认保留 6 位小数,如 3.14 输出为 3.140000 )。
%s:输出字符串(如%s对应char*类型)。
%c:输出单个字符(如%c对应char类型)。

格式修饰符:调整输出宽度、对齐方式等,例如:

%5d:输出整数占 5 列宽度,右对齐。
%.2f:输出浮点数保留 2 位小数(如 3.1415 → 3.14 )。

2.输出项:

需与格式说明符一一对应,类型匹配。
例如:

关于scanf

scanf:格式化输入函数

功能:从控制台(或标准输入设备)读取用户输入的数据,并按指定格式存储到变量中。

语法printf("格式控制字符串",变量地址1,变量地址2,·····);

1.格式控制字符串:

主要包含格式说明符(与printf类似),用于指定输入数据的类型,如%d%f%s等。

普通字符(如逗号、空格)需与用户输入严格匹配

例如

scanf(“%d,%d”,&a,&b) ,用户需输入 10, 20

2.变量地址:

必须使用&运算符获取变量的内存地址(指针),而非直接传递变量名。

注意事项

1.输入缓冲区问题:

输入字符串时(%s),遇空格或换行符会终止,且不包含分隔符

读取字符(%c)时,会读取缓冲区中的空格、换行符等空白字符,需注意清空缓冲区

2.类型匹配:

若输入数据类型与格式说明符不匹配(如给%d输入字符),可能导致程序崩溃或读取错误值。

3.安全隐患:

C99 后建议使用%n等危险格式符时谨慎,避免缓冲区溢出(现代编程中更推荐使用 fgets 等安全函数处理字符串输入)。

总之,scanfprintf是 C 语言基础交互工具,熟练掌握格式控制能灵活处理各种输入输出需求。

八.ASCLL码表参考

👀 关注我们一路同行,从入门到大师,慢慢沉淀、稳步成长
❤️ 点赞鼓励原创,让优质内容被更多人看见
⭐ 收藏收好核心知识点与实战技巧,需要时随时查阅
💬 评论分享你的疑问或踩坑经历,一起交流避坑、共同进步

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 10:29:21

网盘直链下载助手完全指南:一键获取真实下载链接的终极教程

网盘直链下载助手完全指南&#xff1a;一键获取真实下载链接的终极教程 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…

作者头像 李华
网站建设 2026/4/27 10:22:53

企业落地 Agent 的十大挑战

万字深度拆解:企业落地AI Agent的十大核心挑战与破局方案 副标题:从技术选型到组织适配,覆盖90%企业落地过程踩过的坑 摘要/引言 2024年以来,AI Agent已经成为企业数字化转型的核心赛道:Gartner预测到2025年,80%的企业将在业务流程中部署至少一款AI Agent,带来的生产效…

作者头像 李华
网站建设 2026/4/27 10:22:51

PumpClaw:为AI智能体构建去中心化收入基础设施的完整指南

1. 项目概述&#xff1a;为AI智能体构建自主收入基础设施在区块链和人工智能的交汇点上&#xff0c;一个核心的挑战日益凸显&#xff1a;自主运行的AI智能体如何像人类一样&#xff0c;拥有可持续的、无需许可的收入来源&#xff1f;传统的商业模式依赖于中心化的支付网关、繁琐…

作者头像 李华
网站建设 2026/4/27 10:21:25

wcgw:赋予AI本地Shell权限的MCP服务器实战指南

1. 项目概述&#xff1a;当AI助手获得你的终端权限如果你和我一样&#xff0c;经常需要Claude、ChatGPT这类大语言模型帮你写代码、调试脚本&#xff0c;或者自动化处理一些本地任务&#xff0c;那你肯定遇到过这样的场景&#xff1a;你告诉AI“帮我写个Python脚本处理这个CSV文…

作者头像 李华
网站建设 2026/4/27 10:19:21

模型部署提速秘籍:深入对比onnxruntime的CPU/GPU推理性能与优化技巧

模型部署提速秘籍&#xff1a;深入对比onnxruntime的CPU/GPU推理性能与优化技巧 在AI模型从实验室走向生产环境的过程中&#xff0c;推理性能往往是决定成败的关键因素。当面对每秒数千次的推理请求时&#xff0c;即便是毫秒级的优化也能带来显著的资源节约和用户体验提升。on…

作者头像 李华