文章目录
一、数据类型

二、常量
常量是指在程序运行过程中,其值不发生变化的量。常量分为整型、实型(也称浮点型)、字符型和字符串型。
三、变量
变量代表内存中具有特定属性的一个存储单元,它用来存放数据,即变量的值。这些值在执行过程中是可以改变的。
变量名实际上以一个名字代表一个对应的存储单元地址,编译、链接程序时,由编译系统为每个变量名分配对应的内存地址,从变量中取值 实际上是通过变量名找到内存中存储单元的地址,并从该存储单元中读取数据。
变量名的命名也是由规则的,那么规则是什么呢?
C语言规定标识符只能由字母、数字和下划线三种字符组成,并且第一个字符必须为字母或者下划线。
举个例子: sum,_total,month,Student_name,BASCI
编译系统认为大写字母和小写字母是不同的字符,因此C语言要求所有用到的变量做强制定义,即“先定义,后使用”。注意,变量名不能与关键字同名!
四、整型数据
符号常量
定义一个整型变量要使用关键字int
整型常量的不同进制表示
计算机只能存储二进制数,即0和1,而在对应物理硬件上则是高、低电平。
介绍一下不同进制的对应关系。
首先,在计算机中,1字节为8位,1位即二进制的1位,它存储0或1,int型常量的大小为4字节,即32位。
想看详细的进制转换可以看这位博主的理解: 各种进制转换
小技巧:
手动转换一个数的进制后,若不知道转换后的进制数是否正确,则可在Windows操作系统下选择“开始”→“附件”→“计算器”",打开“计算器”,然后选择菜单项“查看”→“程序员”,得到计算器。输入一个十进制数后,单击“十六进制”“八进制”"或“二进制”,即可得到对应进制的转换结果.
整型变量
后面会写到相关知识,变量i是4个字节。
五、浮点型数据
## 浮点型常量
表示浮点型常量形式有两种,e代表10的幂次,幂次可正可负。

[ 注意 ]:
字母e或E之前必须有数字,且e后面的指数必须为整数。
[ 举个例子 ]:

浮点型变量
通过float f来定义浮点变量,f占用4个字节的空间
六、 字符型数据
## 字符型常量
用单引号括起来的一个字符是字符型常量,且只能包含一个字符。
[ 例如 ]:‘a’、‘A’,‘1’,'‘是正确的字符型常量
而’abc’、“a”、" ”是错误的字符型常量。
转义字符:以"\"开头的特殊字符称为转义字符,转义字符用来表示回车、退格等功能键。

字符数据在内存中的存储形式及其使用方法
字符型变量使用关键字char进行定义,一个字符型变量占用1字节大小的空间。一个字符常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把字符的ASCII码值放到存储单元中。打印字符型变量时,如果以字符形式打印,那么计算机会到ASCII码表中查找字符型变量的ASCII码值,查到对应的字符后会显示对应的字符。
这样,字符型数据和整型数据之间就可以通用,字符型数据既可以以字符形式输出,又可以以整数形式输出,还可以通过运算获取想要的各种字符。


字符串型常量
字符串型常量是由一对双引号括起来的字符序列,例如,“How are you”、"CHINA"是合法的字符串型常量,我们可以用printf(“How are you”)输出一个字符串。
注意:‘a’是字符型常量,而"a"是字符串型常量,二者是不同的。
例如,如果先用语句cahr c定义字符型变量c,后令c="a"或c="CHINA"那么这样的赋值是非法的,原因是不可以将字符串型常量赋值给字符型常量。C语言中没有定义字符串型变量的关键字。
C语言规定,在每个字符串型常量的结尾加一个字符串结束标志,以便系统据此判断字符串是否结束,以字符’\0’作为字符串的结束标志。
字符串型常量"CHINA"在内存中存储结果如下图,它占用内存单元不是5个字符,而是6个字符,大小位6字节,最后一个字符为’\0’,在输出时不输出它,因为’\0’无法显示。

八、混合运算
类型强制转换场景
整型数进行除法运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类型转换,否则会出现如图2.8.1所示的结果,j得到的值为2,k得到的值是2.5。
九、常用的数据输入/输出函数
scanf函数的原理
C语言是通过scanf函数读取键盘输入,键盘输入又称标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住,即阻塞(专业术语)。
介绍一下缓冲区原理:
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的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’.
scanf函数的循环读取
如果想输入多个整数〈(每次输入都回车),让 scanf函数读取并打印输出,那么我们需要一个while循环.代码中为什么要加入fflush(stdin)函数呢?因为fflush 函数具有刷新(清空)标准输入缓冲区的作用。如果我们输错了,输入的为字符型数据,那么scanf函数就无法匹配成功, scanf函数未匹配成功时其返回值为0,即 ret的值为0,但这并不等于EOF,因为EOF的返回值为-1。当scanf函数无法匹配成功时,程序仍然会进入循环,这时会导致不断地重复打印.我们的实际执行结果如图2.9.5所示,最后我们按组合键Ctrl+Z,让 scanf函数匹配失败,循环结束。读者可以自行尝试去除fflush(stdin),然后输入a,看一看效果。
多种数据类型混合输入
当我们让scanf函数一次读取多种类型的数据时,对于字符型数据要格外小心,因为当一行数据中存在字符型数据读取时,读取的字符并不会忽略空格和’\n’(回车符)。编写代码时,我们需要在%d与%c之间加入一个空格.输入格式和输出效果如图2.9.9所示, scanf 函数匹配成功了4个成员,所以返回值为4,我们可以通过返回值来判断scanf 函数匹配成功了几个成员,中间任何有一个成员匹配出错,后面的成员都会匹配出错。
getchar函数介绍
使用getchar函数可以一次从标准输入读取一个字符,它等价于char c,scanf( "%c ",&c),语法格式如下:
#include <stdio.h>
int getchar(void);
使用getchar函数读取字符,且每次只能读取一个字符。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c;
c=getchar();
printf("you input alphabet=%c\n",c);
system("pause");
}
putchar函数介绍
输出字符型数据时使用putchar函数,其作用是向显示设备输出一个字符,语法格式如下:
#include <stdio.h>
int putchar(int ch);
其中,参数 ch是要输出的字符,它既可以是字符型变量、整型变量,又可以是常量.输出字符’H’的代码如下:
putchar('H');
printf函数介绍
printf 函数可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等,实际原理是printf 函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后通过’\n’来刷新标准输出,并将结果显示到屏幕上,语法如下:
#include <stdio.h>
int printf(const char *format,...);
printf函数根据format给出的格式打印输出到stdout(标准输出)和其他参数中。
字符串格式(format)由两部分组成:显示到屏幕上的字符和定义printf函数显示的其他参数。我们可以指定一个包含文本在内的format字符串,也可以是映射到printf的其他参数的“特殊”字符,如下列代码所示:
int age=21;
printf("Hello %s, you are %d years old\n","Bob", age);
//代码输出如下
Hello Bob, you are 21 years old
其中,%s表示在该位置插入首个参数(一个字符串),%d表示第二个参数(一个整数)应该放在哪里。不同的%-codes表示不同的变量类型,也可以限制变量的长度。

- 用‰%f精度修饰符指定想要的小数位数。例如,%5.2f 会至少显示5位数字并带有2位小数的浮点数。
- 用%s精度修饰符简单地表示一个最大的长度,以补充句点前的最小字段长度。
- printf 函数的所有输出都是右对齐的,除非在%符号后放置了负号。例如,%-5.2f会显示5位字符、2位小数位的浮点数并且左对齐。
十、运算符与表达式
运算符分类
C语言提供了13种类型的运算符,如下所示。
(1)算术运算符(+一*/ %)
(2)关系运算符(><== >= <= !=).
(3)逻辑运算符(! && ll)
(4)位运算符(<< >> ~|^&)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?😃
(7)逗号运算符(,)
(8)指针运算符(*和&)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)分量运算符(.->)
(12)下标运算符([)
(13)其他(如函数调用运算符())
算术运算符及算术表达式
算术运算符包含+、一、、/和%,当一个表达式中同时出现这5种运算符时,先进行乘()、除(/)、取余 (%),取余也称取模,后进行加(+)、减(一),也就是乘、除、取余运算符的优先级高于加、减运算符。除%运算符外,其余几种运算符既适用于浮点型数又适用于整型数,当操作符的两个操作数都是整型数时,它执行整除运算,在其他情况下执行浮点型数除法。%为取模运算符,它接收两个整型操作数,将左操作数除以右操作数,但它的返回值是余数而不是商。由算术运算符组成的式子称为算术表达式,表达式一定有一个值.
关系运算符与关系表达式
关系运算符>、<、==、>=、<=、!=依次为大于、小于、是否等于、大于等于、小于等于和不等于.由关系运算符组成的表达式称为关系表达式。关系表达式的值只有真和假,对应的值为1和0.由于C语言中没有布尔类型,所以在C语言中О值代表假,非О值即为真。例如,关系表达式3>4为假,因此整体值为0,而关系表达式5>2为真,因此整体值为1。关系运算符的优先级低于算术运算符,给出了比较一个浮点数是否等于某个值的方法,因为关系运算符的优先级低,所以f-234.56不用加括号.浮点数中存储的是对应数的近似值,只能保证精度为7位。
#include stdio.h>
#include <stdlib.h>
//判断浮点数是否等于某个值
int main()
{
float f=234.56;
if(f-234.56 >-0.0001 && f-234.56 <0.0001)
{
printf("f等于234.56\n");
}
else
{
printf("f不等于234.56\n");
}
system("pause");
return 0;
逻辑运算符与逻辑表达式
逻辑运算符!、&&、Il依次为逻辑非、逻辑与、逻辑或,这和数学上的与、或、非是一致的.逻辑非的优先级高于算术运算符,逻辑与和逻辑或的优先级低于关系运算符.逻辑表达式的值只有真和假,对应的值为1和0。
在while循环后,我们演示了什么是短路运算。j=1时,判断jO表达式为假,因为中间为逻辑与,无论后面是真还是假,整体值都为假,所以其后面的printf函数表达式不会再执行,因此看不到打印输出﹔j=0时,jO表达式为真,所以其后面的printf 函数得不到打印,工作中我们经常用短路运算来避免使用if判断,以降低代码量。
针对代码中的逻辑非,首先给变量j赋值10,因为j的值非0,所以!j的值为0;然后,由于逻辑非是单目运算符,结合顺序为从右至左,得到!!j的值为1.也就是说,对О取非,得到的值为1;对非О值取非,得到的值为0.
赋值运算符
为了理解有些操作符存在的限制,必须理解左值(L-value)和右值(R-value)之间的区别。
左值是那些能够出现在赋值符号左边的东西,右值是那些可以出现在赋值符号右边的东西。例如,
a=b+25
其中,a是一个左值,因为它标识了一个可以存储结果值的地点; b+25是一个右值,因为它指定了一个值。
它们可以互换吗?比如下面这种写法:
b + 25 = a;
因为每个位置都包含一个值,所以原先用作左值的a此时也可以作为右值;然而, b+25不能作为左值,因为它并未标识一个特定的位置(并不对应特定的内存空间)。因此,上面这条赋值语句是非法的。
复合赋值运算符
复合赋值运算符操作是一种缩写形式,使用复合赋值运算符能使对变量的赋值操作变得更加简洁。例如,
iNum = iNum + 5;
对变量iNum的赋值进行操作,值为这个变量本身与一个整型常量5相加的结果.使用复合语句可以实现同样的操作。例如,上面的语句可以修改为
iNum+=5;
赋值运算符与复合赋值运算符的区别如下:
(1)复合赋值运算符简化了程序,可使程序精炼,提升阅读速度。
(2)复合赋值运算符提高了编译效率。
条件运算符与逗号运算符
条件运算符是C语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑与运算符就是双目运算符;单目运算符代表有一个操作数,如逻辑非运算符就是单目运算符.运算符也称操作符。逗号运算符的优先级最低,我们需要掌握的是,逗号表达式的整体值是最后一个表达式的值.下面我们来看一个实例,如下所示,通过条件运算符我们可以快速得到3个数中的最大值,避免了很多if 判断。通过逗号运算符,我们可以先做一些准备操作,而最终while 循环是否结束取决于scanf(“%d%d%d”,&a,&b,&c)!=EOF这个关系表达式的真假。
#include <stdio.h>
#include <stdlib.h>
//逗号表达式整体的值,是最后一个表达式的值
//条件运算符优先级高于赋值运算符
int main()
{
int a,b,c,max;
while(fflush(stdin) , scanf("%d%d%d" ,&a,&b,&c)!=EOF)
{
max=(a>b?a: b)>c?(a>b?a:b):c :
printf("max=%d\n" , max) ;
}
system("pause");
return 0;
自增、自减运算符及求字节运算符
如何才能掌握自增、自减运算符?只要做到了分开两条语句来计算,就肯定不会出错。例如下图中的j=i++>-1,对于后++或者后–,首先我们需要去掉++或–运算符,也就是首先计算j=i>-1,因为i本身等于-1,所以得到j的值为0,接着单独计算i++,也就是对 i 加1,所以i从-1加1得到0,因此printf(“i=%d,j=%d\n”,i,j);语句的执行结果是О和0。
#include <stido.h>
#inculde <stdlib.h>
// sizeof不是函数,是C的关键字,是一个运算符
//自增自减注意分清是前加加,还是后加加,自减类似
//针对后加加,后减减,按照备注理念,可以保证简单准确!
int main()
{
int i=-1;
int j;
//5++;/l如果打开该句,会造成编译不通
j-i++>-1;//后++,或者后--等价于j=i>1 ; i=i+1;
printf("i=%d,j=%d\n",i,j);
j=!++i ;//当时前加加时,直接按优先级结合顺序
printf("i=%d,j=%d, sizeof(i)=%d\n",i,j,sizeof(i));
system("pause");
}
本文介绍了C语言中的基本数据类型,包括整型、浮点型、字符型以及字符串型,详细阐述了变量、常量的概念和使用,以及不同类型数据的表示和转换。还讨论了运算符的分类,如算术、关系、逻辑运算符,以及混合运算中的类型转换。此外,重点讲解了数据输入/输出函数,如scanf、printf、getchar和putchar的使用方法和注意事项。

1318

被折叠的 条评论
为什么被折叠?



