【二】数据类型、运算符与表达式
【二】数据类型、运算符与表达式
学习目标
- 数据类型
- 常量与变量的差异
- 整型、浮点型、字符型的原理及应用
- scanf函数的原理及应用
- 运算符与表达式
2.1 数据类型
数据类型的分类如下
C语言中的关键字
auto | const | double | float | int | short | struct | unsigned |
break | continue | else | for | long | signed | switch | void |
case | default | enum | goto | register | sizeof | typedef | volatile |
char | do | extern | if | return | static | union | while |
2.2 常量
常量是指在程序运行过程中,其值不发生变化的量。常量又可分为整型、实型(也称浮点型)、字符和字符串型。
整型常量、实型常量、字符型常量是在编译时可以直接编入代码段的常量;字符串型常量是指存放在字符串型常量区中的常量。
【注】“”代表空串,即空的字符串
2.3 变量
变量代表内存中具有特定属性的一个存储单元,它用来存放数据,即变量的值。这些值在程序的执行过程中是可以改变的。变量名实际上以一个名字代表一个对应的存储单元地址。编译、链接程序时,由编译系统为每个变量名分配对应的内存地址。从变量中取值实际上是通过变量名找到内存中存储单元的地址,并从该存储单元中读取数据。变量的命名规则:只能由字母、数字和下划线三种字符组成,并且第一个字符必须为字母或下划线。
【注】C语言区分大小写,&a表示取a的地址
2.4 整型数据
2.4.1 符号常量
define定义的内容是常量,符号常量不可以赋值
#include <stdio.h> //引用头文件 #define PI 3 //PI就是符号常量 int main() { int a = 3;//a是一个变量 a = 5; //PI = 10;//符号常量不可以赋值 printf("%d\n", PI); }
2.4.2 整型常量的不同进制表示
计算机中只能存储二进制数,即0和1,而在对应的物理硬件上则是高、低电平。为了方便地观察内存中二进制数情况,除正常使用的十进制外,计算机还提供了十六进制数和八进制数。关于进制及进制间的相互转化此处略。十进制0-9,八进制0-7,十六进制0-9,A-F。
在计算机中,1字节为8位,1位即二进制的1位,它存储0或1,int型常量的大小为4字节,即32位。
1kb = 1024字节
1mb = 1024kb
1Gb = 1024mb
2.4.3 整型变量
int i,变量i是4个字节
2.5 浮点型数据
2.5.1 浮点型常量
表示浮点型常量的形式有两种,如下表,其中e代表10的幂次,幂次可正可负。
小数形式 | 0.123 |
指数形式 | 3e-3(为3x10-3,即0.003) |
【注】:字母e(或E)之前必须有数字,且e后面的指数必须为整数。
2.5.2 浮点型变量
通过float来定义浮点变量,f占用4个字节的空间。
2.6 字符型数据
2.6.1 字符型变量
用单引号括起来的一个字符是字符型常量,且只能包含一个字符。如,'a','A','1',' '是正确的字符型常量,而'abc',“a”,“ ”是错误的字符型常量。
用“\”开头的特殊字符被称为转义字符,转义字符用来表示回车、退格等功能键。
转义字符 | 作用 |
\n | 换行 |
\b | 退格 |
\\ |
反斜杠 |
2.6.2 字符数据在内存中的存储形式及其使用方法
字符型变量使用关键字char进行定义,一个字符型变量占用1字节大小的空间。一个字符常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把该字符的ASCII码值放到存储单元中,打印字符型变量时,若以字符形式打印,那么计算机会到ASCII码表中查找字符型变量的ASCII码值,查到对应的字符后会显示对应的字符,这样,字符型数据和整型数据之间就可以通用。字符型数据既可以以字符的形式输出,又可以以证书形式输出,还可以通过运算获取想要的葛洪字符。
大小写字母转换,小写字母减去32可转为大写字母。
ASCII表
2.7 字符串型常量
字符串型常量是由一对双引号括起来的字符序列,例如“How do you do”。在每个字符串型常量常量的结尾加一个字符串结束标志,以便系统据此判断字符串是否结束,C语言规定以字符'\0'作为字符串结束标志。
字符串型常量“CHINA”在内存中存储结果如下
C | H | I | N | A | \0 |
【注】:'a‘是字符型常量,而“a”是字符串型常量,二者不同。
不可以将字符串型常量赋值给字符型常量。
2.8 混合运算
2.8.1 类型强制转换场景
整型数进行除法运算时,如果运算结果为小数,那么存储浮点数一定要进行强制类型转换。
#include <stdio.h> int main() { int i = 5; float j = i / 2; //j输出2.000000 float k = (float)i / 2; //k输出2.500000 printf("j=%f,k=%f\n", j,k); }
2.9 常用的数据输入/输出函数
2.9.1 scanf函数的原理
C语言未提供输入/输出关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又称为标准输入,当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡主(专业用语为阻塞)。
scanf读取的是标准输入,printf输出到控制台,输出到了标准输出。
#include <stdio.h> int main() { int a,b; scanf("%d%d", &a,&b);//一定要在变量前加入&符号 printf("a=%d,b=%d\n", a,b); printf("%d\n", a + b); }
scanf使用方法
#include <stdio.h> int scanf(const char * format,...);
format是一个字符串,...是可变参数,参数的数目与format中的%的数目保持一致。%d,%f,%c可以混合使用,不限制出现次数。
%d | 一个十进制整数 |
%f | 一个浮点数 |
%c | 一个单一的字符 |
缓冲区原理
行缓冲:当在输入和输出中遇到换行符时,将执行真正的I/O操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作,典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout) .
举例,向标准输入缓冲区中放入的字符为20\n',输入'\n'(回车)后,scanf 函数才开始匹配,scanf函数中的%d匹配整型数20,然后放入变量i中,接着进行打印输出,这时'\n'仍然在标准输入缓冲区(stdin)内,如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为scanf 函数在读取整型数、浮点数、字符串时,会忽略'\n'(回车符)、空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞) .,scanf函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'。
#include <stdio.h> //缓冲区为空的时候,scanf才会阻塞 int main() { int i; char c; float f; scanf("%d",&i); printf("i=%d\n",i); //scanf("%c",&c); //printf("c=%c\n", c); scanf("%f", &f); printf("f=%f\n", f); }
2.9.2 scanf函数的循环读取
#include <stdio.h> int main() { int i,ret; while (rewind(stdin),(ret=scanf("%d", &i))!=EOF) //while是实现循环,后面要有一个小括号 { printf("i=%d\n", i); } return 0; }
scanf循环读取发生错误时返回EOF。代码中的rewind函数具有刷新标准输入缓冲区的作用。
2.9.3 多种数据类型混合输入
#include <stdio.h> //一个scanf读多种类型的数据 //混合输入时每次在%c之前需要加入一个空格 int main() { int i; char c; float f; scanf("%d %c%f", &i, &c, &f); printf("i=%d,c=%c,f=%f\n", i, c, f); return 0; }
2.10 运算符与表达式
2.10.1 运算符分类
C语言提供了13种类型的运算符
(1)算术运算符(+ - * / %)
(2)关系运算符(> < == >= <= !=)
(3)逻辑运算符(! && ||)
(4)位运算符(<< >> ~| ^ &)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?:)
(7)逗号运算符(,)
(8)指针运算符(*和&)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)分量运算符(.->)
(12)下标运算符([])
(13)其他(如函数调用运算符())
2.10.2 算术运算符及算数表达式
算数运算符包含= - * / %,当一个表达式中同时出现这5种运算符时,先乘除取模,后进行加减。
int a = 4 + 5 * 2 - 6 / 3 + 11 % 4;
2.10.3 关系运算符与关系表达式
关系运算符> < == >= <= !=依次为大于 小于 等于 大于等于 小于等于 不等于,由关系运算符组成的表达式称为关系表达式,关系表达式的值只有真和假,C语言认为一切非零值都是真。
2.10.4 逻辑运算符与逻辑表达式
!逻辑非 如果原来是真,取非就是假,如果是假,取非就是真
&& 逻辑与 a&&b,a和b任何一个为假,就是假,如果均为真,整体为真
|| 逻辑或 a||b,a和b任何一个为真,为真,如果均为假,整体才是假
逻辑运算符组成的式子叫逻辑表达式,逻辑表达式只有真和假,表达式的值存在于运算过程中
#include <stdio.h> //关系运算符和逻辑运算符 int main() { //printf("%d\n", 5 < 3); //printf("%d\n", 5 > 3); int a = 18; if (3 < a &&a < 10) //要同时判断a>3和a<10要使用逻辑运算符 { printf("a is right\n"); else { printf("a is wrong\n"); } }
2.10.5 赋值运算符
#include <stdio.h> //赋值运算符的左边只能放变量 int main() { int a = 5; //a + 3 = 10;//如果爆出左操作数必须为左值的错误,这时说明等号左边必须是变量 printf("a=%d\n", a); }
2.10.6 自增、自减运算符及求字节运算符
#include <stdio.h> //++i直接按优先级进行正常运算即可 int main() { int i = -1; int j; j = i++ > -1;//后加加拆成两步j=i>-1;i++ printf("i=%d,j=%d\n", i,j);//0 0 printf("i的字节数=%d\n", sizeof(i)); }
自增和自减不能用于常量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异