语言基础之数据类型、运算符及表达式
(一)数据及数据的表现形式
1. 数据
是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合,数据不仅仅指我们通常所说的数值类型,还包括字符及声音,图像,视频等非数值类型。
2. 数据的表现形式
- 常量 -----其值在运行过程不能改变的量
- 变量 -----用来存放变量,即变量的值
- 常变量 -----其值不能改变的变量
- 标识符 -----给对象取名字
2.1 常量
在程序运行过程中,其值不能被改变的量。
常量一般出现在表达式或赋值语句中。
常量的分类
整形常量 | 100,123,-3等 |
---|---|
实型常量 | 123.4,3.14,0.345等 |
字符常量 | ‘1’,‘a’,'\n’等 |
字符串常量 | “123” ," abc"等 |
符号常量 | 如#define PI 3.14 |
常量的几点注意事项 |
①字符常量有且仅包括一个字符,且用单引号’ '表示。
②字符串常量可以包括全部字符,用双引号" "表示。
③转义字符是以’\ '开头的特殊的字符序列,常用的总结如下:
\\ | 表示反斜杠 |
---|---|
\n | 表示换行符 |
\r | 表示回车 |
\t | 表示制表符 |
2.2 标识符
1.定义
用来给变量、符号常量、函数、数组、类型等命名的有效字符序列。
2.命名规范
①只能由字母、数字、下划线三种符号组成。
②必须以字母或者下划线开头。
③不能使用关键字。(如int是整形变量的关键字)
2.3 变量
-
在运行过程中其值可以被改变。
-
变量必须先定义后使用。
int b =2; //变量的初始化
b=2; //报错,变量a没有定义
//
3. 变量定义的格式。
数据类型 变量名 = 变量值
例如定义一个整型变量sum, int sum = 0;
- 变量的实质。
以int b=2 为例,
5.变量的特点
①变量在编译时系统会给其分配相应的内存空间。
②可以通过变量名或者地址访问内存空间。
2.4 常变量
- 定义
运行期间其值不会改变的变量。
- 格式
const 数据类型 变量名 = 变量值
如const int a = 3;
注意事项:
- 符号常量和变量的区别
①符号常量是不占内存的,只是一个临时符号,预编译完成后就消失了。
②符号常量用大写表示。
- 常变量与常量的异同
①常变量具有变量的基本属性,即有类型、占存储单元。
②不允许改变其值。
2.5 进制(补充)
- 定义
进制就是一种进位方法,对于任意X进制就表示某一位置上进行运算时是逢X进一。十进制是逢10进一,十六进制是逢16进一,二进制就是逢二进一,简而言之,X进制就是逢X进一。
- 其他进制转10进制。
两点注意项: 左边是高位,右边是低位。按权展开即可。
举例:
二进制1010转化为10进制是多少?
0* 2 0 2^0 20+1* 2 1 2^1 21+0* 2 2 2^2 22+1* 2 3 2^3 23 = 10
八进制1010转化为10进制是多少?
0* 8 0 8^0 80+1* 8 1 8^1 81+0* 2 2 2^2 22+1* 8 3 8^3 83 = 520
十六进制1010转化为10进制是多少?
0* 1 6 0 16^0 160+1* 1 6 1 16^1 161+0* 1 6 2 16^2 162+1* 1 6 3 16^3 163 = 4112
- 10进制转其他进制。
方法:用10进制数除以X(X进制),分别取余数和商,商为0时,将余数倒着数就是转化以后的结果。
举例:将10进制数17,转化为二进制数、八进制数和16进制数分别是多少?
二进制10001
17÷2=8余1 取商8÷2=4余0 取商4÷2=2余0 取商2÷2=1余0 取商1÷2=0余1
结果为倒着取余数,所以结果是10001
八进制21
17÷8=2余1 取商2÷8=0余2
结果为倒着取余数,所以结果是21
十六进制11
17÷16=1余1 取商1÷16=0余1
结果为倒着取余数,所以结果是11
- 二进制、八进制、十六进制的相互转化
二进制转八进制 (从右往左分,八进制一位对应二进制3位)
1010101111011
101 010 111 011 //52173
- 八进制转二进制
1234 //001 010 011 100
即001010011100
- 二进制转16进制 (从右往左分,十六进制一位对应二进制4位)
1010111010010000
1010 1110 1001 0000 //AE90
(十六进制0-9后用A(10)BCDEF(15)表示)
- 16进制转二进制
A87 //1010 1000 0111
即101010000111
相应的进制在C语言中的表示
十进制 | 以正常数字1-9开头,如15 |
---|---|
八进制 | 以数字0开头,如015 |
十六进制 | 以数字0开头,如015 |
二进制 | C语言不能直接书写二进制数 |
2.6 计算机数值存储方式(补充)
- 原码
①一个数的原码是原始的二进制码。
②最高位是符号位,0表示正,1表示负。
③数值位就是数值本身的绝对值的二进制数。
④负数的原码是在绝对值的基础上,最高位为1.
下面以1个字节进行说明:
十进制数 | 原码 |
---|---|
+13 | 0000 1101 |
-13 | 1000 1101 |
+0 | 0000 0000 |
-0 | 1000 0000 |
不难发现:使用原码存储数据会产生两个问题:
①数值0有两种表示方法。.
②正数和负数相加,结果不正确(计算机只会加法,减法的实质就是加法)。
例如使用原码计算1-1,结果如下:
1 0000 0001
-1 1000 0001
1-1=1+(-1)=00000010000001=-2 //结果不正确
- 反码
①对于正数,反码和原码相同。
②对于负数,符号位不变,其他部分按位取反。
下面以1个字节进行说明:
十进制数 | 反码 |
---|---|
+13 | 0000 1101 |
-13 | 1111 0010 |
+0 | 0000 0000 |
-0 | 1111 1111 |
注意:使用反码存储数据会产生1个问题:
②数值0有两种表示方法。
反码解决了正数和负数相加的问题:
如1-1,使用反码
1 0000 0001
-1 1111 1110
1-1=1+(-1)=00000001+11111110= 11111111=-0=0
- 补码
①计算机中存储数据都是补码形式,为了解决负数存储问题。
②对于正数,原码、补码、反码都相同。
③对于负数,其补码为其反码加1。
④补码符号位不变,其他位求反,最后整个数加1,得到原码。
有符号整数的范围是 -128 ~ +127;另外(有符号整数)1000 0000被人为规定为 -128的补码。
对负数求补码:就是将该数的绝对值的二进制形式,按位取反再+1
十进制数 | 补码 |
---|---|
+13 | 0000 1101 |
-13 | 1111 0011 |
+0 | 0000 0000 |
-0 | 0000 0000 |
计算机使用补码存储的意义;
①统一了0的编码。
②将减法运算变为加法运算。
③两个用补码表示的数相加时,如果最高位有进位,则进位被舍弃。
计算机补码的使用实践
#include <stdio.h>
int main()
{
//如果使用二进制、八进制、十六进制,即为补码表示。
char a = 0x85;
printf(" a=%d\n ",a); //补码转原码
//如果用10进制表示,即站在用户的角度,原码表示。
char b = -15;
printf("b=%x\n", b); //原码转补码
return 0;
}
//char型一个字节,0x85在计算机中以补码表示即1000 0101(转原码)–>1111 1010–>(加1)1111 1011(即-123)
//-15即1000 1111–>1111 0000–>1111 0001
a=-123
b=fffffff1
sizeof运算符的使用
sizeof不是函数,所以不需要包括任何头文件,它的功能是计算一个数据类型的大小,单位为字节。
sizeof的返回值为size_t。
size_t类型在32位操作系统下是unsigned int,是一个无符号整数。
#include <stdio.h>
int main()
{
//这里数据类型的作用,其实就是告诉编译器定义
//此类型的变量需要多大的内存空间。
int a = sizeof(int);
printf("sizeof (char) = %u\n",sizeof (char));
printf("sizeof(int) = %u\n",sizeof(int));
printf("sizeof(int) = %u\n",a);
return 0;
}
sizeof(char) = 1
sizeof(int) = 4
sizeof(int) = 4
(二)数据类型
1. C语言数据类型分类
1. 基本数据类型
①整型类型
②浮点类型
2. 枚举类型
3. 空类型
4. 派生类型
①指针类型
②数组类型
③结构体类型
④共用体类型
⑤函数类型
1.1 整型类型的分类
- 基本整型(int型)
①占2个或者4个字节,由编译系统决定。
②以整数的补码形式存放。
- 短整型(short int)
以VisualC++为例,占2个字节。
- 长整型(long int)
以VisualC++为例,占4个字节。
- 双长整型(long long int)
以VisualC++为例,占8个字节。
1.2 整型类型的基本用法
常用的打印格式
打印格式 | 含义 |
---|---|
%hd | 输出short 类型 |
%d | 输出int类型 |
%l | 输出long类型 |
%ll | 输出long long类型 |
%hu | 输出unsigned short类型 |
%u | 输出unsigned int类型 |
%lu | 输出unsigned long类型 |
%llu | 输出unsigned long long类型 |
C语言程序示例 |
#include <stdio.h>
int main()
{
int a =12;
short int b = 2;
long int c =3451;
printf("a=%d\n",a);
printf("b=%hd\n",b);
printf("c=%ld\n",c);
}
a=12
b=2
c=3451
注意:
类型长度long > int > short
小的数据类型赋值给大的数据类型,系统会自动转换。大的数据类型赋值给小的数据类型会损失高位。
有符号与无符号的区别
有符号数最高位表示符号位,0为正数,1为负数。
无符号数最高位是数值位,只能表示正数。
具体应用如下:
#include <stdio.h>
int main()
{
//定义一个有符号数0x80000001
printf("%d\n", 0x800000f4);
printf("%u\n",0x800000f4);
signed int a= -12; //等价于int a=-12;
unsigned int b = 12; //只能表示正数
unsigned int c = 0x800000f4;
printf("c=%d\n",c); //输出结果以%d为准
printf("c=%u\n",c); //输出结果以%u为准
return 0;
}
输出结果:
-2147483404
2147483892
c=-2147483404
c=2147483892
有符号整教与无符号整教的取值范围
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short | 2字节 | -32768到32767 (- 2^15 ~ 2^15 -1) |
int | 4字节 | -2147483648到2147483647 (-2^31 ~ 2^31-1) |
long | 4字节 | -2147483648到2147483647 (-2^32 ~ 2^32-1) |
unsigned short | 2字节 | 0到65535(0 ~ 2^16 -1) |
unsigned int | 4字节 | 0到4294967295 (0 ~ 2^32 -1) |
unsigned long | 4字节型 | 0到4294967295 (0 ~ 2^32 -1) |
1.3 字符型数据
-
内存中没有字符,只有数字,存放字符实际上存放的是其ASCII码(即一个字符对应
一个数字的一张表)。 -
使用字符赋值和使用ASCII码赋值作用是一样的。
-
字符类型的实质就是一个字节的整数。
-
字符的使用示例:
#include <stdio.h>
int main()
{
char ch = 'a';//定义字符a
char b = 97;//和使用字符赋值是等效的
printf("ch=%c\n",ch);//输出字符a
printf("ch=%d\n",ch);//输出字符a对应得ascii码
printf("b=%c\n",b);//输出字符a
return 0;
}
ch=a
ch=97
b=a
练习:大小写字母转换
解题关键:小写字母与大写字母之差为32。
程序示例:
#include <stdio.h>
int main()
{
char ch = 'a';//定义字符a
char ch2 ='A';
printf("ch=%c\n",ch-32);//小写转大写
printf("ch=%c\n",ch2+32);//大写转小写
return 0;
}
ch=A
ch=a
转义字符
-
以 / 开头的特殊字符序列,原则上字符’ '里面只能有一个字符,但转义字符除外。
-
常见的转文字符为 \t(制表符),\n(换行符)
-
程序示例:
#include <stdio.h>
int main()
{
char ch = '\t';
char ch2 = '\n';
printf("abedef\n");
printf("abf%cdef\n",ch);
printf("abc");//因为没有换行符\n所以打印结果与下一行打印结果在同一行
printf("abc%c",ch2);
printf("这有一个换行符");
}
abedef
abf def
abcabc
这有一个换行符
char类型的范围
- 取值范围如下(从用户的角度分析):
数据类型 | 占用空间 | 取值范围 |
---|---|---|
char | 1字节 | -128 ~ 127 (- 2^7 ~ 2^7-1) |
unsigned char | 1字节 | 0到255(0 ~ 2^8 -1) |
- 赋值时一定要注意不要超过取值范围。
代码示例:
#include <stdio.h>
int main()
{
char ch = 127+1;
unsigned char ch2 = 255+1;//0
printf("ch=%d\n",ch); //-128
printf("ch2=%d\n",ch2);
}
ch=-128
ch2=0
main.c: In function ‘main’:
main.c:4:21: warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘256’ to ‘0’ [-Woverflow]
赋值越界。
(菜鸟在线编译环境)
https://c.runoob.com/compile/11
1.4 浮点数类型数据
浮点型的作用是用来存储小数的,常见的主要是两种,单精度浮点型float双精度浮点型double 其中,double所表示的浮点数比float要更准确。
数据类型 | 占用空闻 | 有效数字范围 |
---|---|---|
float | 4字节 | 6位有效数字 |
double | 8字节 | 15位有效数字 |
程序示例:
#include <stdio.h>
int main()
{
float a =100.9f; //带f表示是float型
double b = 3.14; //不带f的是double型
printf("a=%f\n",a);
printf("b=%lf\n",b);
return 0;
}
a=100.900002
b=3.140000
1.5 字符串常量
字符串是内存中一段连续的 char空间,以’\0’(数字0)结尾。
字符串常量是由双引号括起来的字符序列,如"abe" ," love"等。
字符常量与字符串常量的区别:
每个字符串的结尾,编译器会自动的添加一个结束标志位”\0’,即"a" 包含两个字符
‘a’和’\0’。
1.6 字符串输出之printf函数
定义格式。
printf(格式控制,输出表列)。
程序示例:
#include <stdio.h>
int main()
{
int a =10;
double b = 3.14;
printf("country=%s\n","china");//输出字符串
printf("%%\n");//输出一个百分号。
//%3d表示输出共有3个字符,不足则用空格补,默认右对齐
printf(" a=%3d\n",a);
//-表示左对齐
printf(" a=%-3d\n",a);
printf(" b=%1f\n",b);
//m.n,m表示共有多少位,n表示保留多少个小数位
printf("b=%6.21f\n",b);
}
country=china
%
a= 10
a=10
b=3.140000
b=3.140000000000000124345
1.7 字符串输入之scanf函数
定义格式。
scanf(格式控制,地址表列)。
程序示例:
#include <stdio.h>
int main()
{
int age;
printf("请输入年龄:");
scanf ("%d",&age);
printf("age=%d\n",age);
return 0;
}
请输入年龄:18
age=18
字符输入输出函数
定义格式。
putchar( c )
getchar( c )
程序示例:
#include <stdio.h>
int main()
{
char ch;
printf("请输入性别:");
ch = getchar();
putchar(ch);
//putchar('\n');
return 0;
}
(三)运算符与表达式
1. 运算符
常用运算符的分类
运算符类型 | 作用 |
---|---|
算术运算符 | 用于处理四则运算 |
赋值运算符 | 用于将表达式的值赋给变量 |
比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
位运算符 | 用于处理数据的位运算 |
sizeof运算符 | 用于求字节数长度 |
1.1 算数运算符
1.基本运算符
+、-、*、/、%
5/2 //?如果要得到正确的值怎么做?
程序示例:
#include<stdio.h>
int main()
{
int a = 5;
int b = 2;
int c = a/b;
printf("c=%d\n",c);
return 0;
}
结果:2
2.自增或者自减运算符
++i、 i++、 --i、 i–
a=3
b= ++a //a=?b=?
b=a++ //a=?,b=?
思考: a++; b=a; a?,b?
#include<stdio.h>
int main()
{
int a =3;
int b =0;
//前置++(先将a的值加1,在使用)
b = ++a;
printf("a=%d,b=%d\n",a,b);
//后置++(先使用a的值,在加1)
a = 3;
b = 0;
b = a++;
printf("a=%d,b=%d\n",a,b);
return 0;
}
结果:
a=4,b=4
a=4, b=3
1.2 赋值运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=1; | a=2; b=1; |
+= | 加等于 | a=0; a+=1; | a=1; |
-= | 减等于 | a=5; a-=2; | a=3; |
*= | 乘等于 | a=3; a=2;* | a=6; |
/= | 除等于 | a=6; a/=3; | a=2; |
%= | 模等于 | a=3; a%2; | a=1; |
1.3 比较运算符
1.在C语言比较运算符中,真用数字1表示假,用数字0表示。
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4==2 | 0 |
!= | 不等于 | 4!=2 | 1 |
< | 小于 | 4<2 | 0; |
| 大于|4>2 | 1
<= | 小于等于|4<=2 |0
= | 大于等于|4>=2 |1
2.程序示例
#include<stdio.h>
int main(){
printf("4==3的结果为:%d\n",4==3);
printf("4!=3的结果为:%d\n",4!=3);
return 0;
}
1.4 逻辑运算符
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则a为真:如果a为真,则!a为假 |
&& | 与 | a&&b | 如果a和b都为真,则结果为真,否则为假。 |
II | 或 | a II b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假. |
1.5 运算符优先级
同一优先级的运算符,结合次序由结合方向所决定。
简单记就是: ! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
1.6 强制类型转换运算符
- 一般形式
(类型名)表达式
float a=7.5,int b=3;
int c =a/b //?是否正确
- 缺点
损失精度
- 规则
小类型到大类型的转换是自动的。
大类型到小类型的转换需要强制转换。
练习
unsigned short a =65535;
short b = a;
执行上述程序段后,b 的值是
A. -1 B. -32767 C. -32768 D. -65535
自学自用,难免存在错误,如有错误,请给予指正。在这里将自己的心得和学习过程分享给大家,为大家提供一些思路,希望大家在学习的道路上少走一些弯路。
部分资源来源于网络,如有侵权,请联系本人予以删除!