文章目录
一. 数据类型
1. 数据类型转换
(1)自动类型转换
不同类型的数据在一起运算时,编译系统会自动进行类型转换。进行自动转换的规则是:
把占用内存空间少的(低级)类型向占用空间多的(高级)类型转换,以保证运算的精度
如图:
- 图中横向箭头表示必定的转换,如 char 型、short 型数据必定先转换为 int 型,float 型数据在运算时将先转换成 double 型,以提高运算精度(即使是两个 float 型数据相加,也要转换成 double 型,然后再相加)
- 图中纵向箭头表示当经过横向的转换后,进行运算的数据类型仍然不同时的转换方式。在不同数据类型的转换过程中,类型转换顺序并不是按箭头方向一步一步的转换,可以没有中间类型转换。例,in t型与 double 型数据进行运算,先将 int 型的数据直接转换成 double 型,然后再进行两个同类型(double型)数据的运算
- 转换只会影响表达式的运算结果类型,并不改变原变量的定义类型,并且其数据值也不会发生任何改变
- 当赋值运算符两边的运算对象类型不同时,也要发生类型转换,转换的规则是:把赋值运算符右边表达式的类型转换为左边变量的类型。
(2)强制类型转换
(类型说明符) (表达式)
-
功能:把表达式的运算结果强制转换成类型说明符指定的类型
例如:#include<stdio.h> int main() { int a=3,b=4; float c; c=(float)(a+b)/2;//将int型 7 强制转换为float型 7.0 printf("c=%f\n",c); return 0; }
二. 常量
1. 直接常量
(1)整型常量
即整数,包括正整数、负整数和零
a. 十进制表示
- 由正负号和数字0~9组成,例 -123
b. 八进制表示
- 由数字0(前缀)和数字0~7组成,例 045
- 一般为无符号整数
c. 十六进制表示:
- 由前缀0x或0X和数字0~9或字母A~F(表示10~15,大小写均可),例 0x12cD
- 一般为无符号整数
(2)实型常量
- 即实数,又称浮点数,在C语言中只能用十进制表示
- 实型常量默认为是 double 型的实数,在数的后面加上f或F(如1.23f)才认为是 float 型的实数
a. 小数形式表示
- 由整数部分、小数点、小数部分组成,例 -12.34 ;
- 当整数部分或小数部分为0时可省略不写,但小数点不可省略,且小数点前后至少一边要有数字,例 12. 和 -.123
b.指数形式表示
-
由尾数部分、字母 e或E 和指数部分组成,格式:±尾数E(e)指数,例 -1.2E-2,表示 -1.2 x (10)-2 ; 1.2e2,表示1.2 x (10)2
-
字母E(或e)前后必须有数字并且指数部分只能是整数
(3)字符型常量
由单引号括起来的单个字符,如 ‘A’
- 可以是ASCII字符集中的任意字符(即可像整数一样参加运算)
- 每个字符在内存中占用一个字节
- 转义字符 在内存中也只占用一个字节
(4)字符串常量
由双引号括起来的零个或多个字符序列,如"He MengYuan"
- 字符串中可以使用空格字符、转义字符、空字符和其他字符,还有汉字等文字字符
- 字符串常量在内存中占用一段连续的存储单元
- 系统在每个字符串后面自动加上结束标志 ‘\0’,因此n个字符的字符串占用n+1个字节空间
- 可用 sizeof 运算符(见四)来计算字符串占用的内存空间大小
- 可用strlen()函数来计算字符串长度
2.符号常量
在C语言中可以用一个标识符来表示一个常量,称为符号常量,符号常量在使用前必须先定义,一般形式为:
#define 标识符 常量值 //#define 宏定义命令
例如:#define PI 3.14
//在需要3.14时使用PI就可以
三. 变量
1. 字符型变量
char c1,c2;
- 有数值特征,可以像整数一样参加运算
- 允许对整型变量赋以字符值,也允许对字符变量赋以整型值
- 允许把字符变量按整型量输出,也允许把整型量按字符量输出
2. 实型变量
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
float | 单精度型 | 4 | 3.4E-38~3.4E+38 |
double | 双精度型 | 8 | 1.7E-308~1.7E+308 |
- 单精度型数据能保留7位有效数字,之后的数据无效
- 双精度型数据能保留16位有效数字,但在VS中最多保留6位小数,第7位小数需进行四舍五入
例如:
#include<stdio.h>
int main()
{
float a = 1234.567689456;
double b = 1234.567895678;
printf("a=%f,b=%f\n", a, b);
return 0;
}
结果为:
a=1234.567749,b=1234.567896
3. 整型变量
关键字 | 类型 | 占用字节数 | 取值范围 |
---|---|---|---|
short int | 短整型 | 2 | -32768~32767(-215~215-1) |
int | 整型 | 4 | -2147483648~2147483647(-231~231-1) |
long int | 长整型 | 4 | -2147483648~2147483647(-231~231-1) |
unsigned short | 无符号短整型 | 2 | 0~65535(0~216-1) |
unsigned int | 无符号整型 | 4 | 0~4294967295(0~232-1) |
unsigned long | 无符号长整型 | 4 | 0~4294967295(0~232-1) |
注:以上数据只是在Visual C++2010环境下,各种类型的数据所占内存的大小随编译系统的不同而有差异
四. 运算符和表达式
1. 赋值运算符和赋值表达式
(1)简单赋值运算符
等号 =
int a,b,c=1;
//等价于
int a=1,b=1,c=1;
//但千万不能像下面这样写
int a=b=c=1;
(2)复合赋值运算符
运算符 | 应用举例 | 等价形式 |
---|---|---|
+= | a+=x | a=a+(x) |
-= | a-=x | a=a-(x) |
*= | a*=x | a=a*(x) |
/= | a/=x | a=a/(x) |
%= | a%=x | a=a%(x) |
(3)赋值表达式
变量=表达式
-
如果“=”左右两边类型不同,系统会按照赋值类型转换的原则将右边的类型转换成左边的类型。
例如:#include<stdio.h> int main() { int a; float b=123.456; a = b; printf("%d\n", a); return 0; }
结果为:
123
2. 算术运算符和算术表达式
(1)基本的算术运算符
运算符 | + | - | * | / | % |
---|---|---|---|---|---|
名称 | 加 | 减 | 乘 | 除 | 取余 |
-
/ 除法运算符:在计算a/b时,如果a、b都为整型,其商也为整型,小数部分被舍去,例 1/2=0;如果a、b中有一个是实型,则a、b都转换为 double型,然后相除,结果为 double 类型,例1.0/2=0.5
见下面一段代码:#include<stdio.h> int main() { float a; a = 1 / 2*3;//计算3的一半 printf("%f\n", a); return 0; }
我们理想的结果应该是:
1.500000
但为:
0.000000
正确代码应为:
#include<stdio.h> int main() { float a; a = 1.0 / 2*3;//计算3的一半 printf("%f\n", a); return 0; }
-
% 求余运算符:结果为两个数相除后的余数,要求参与运算的两个运算对象都必须是整型,其结果也是整型,例7%2=1;求余运算结果的符号与第一个操作数符号相同,例7%-2=1
(2)自增、自减运算符
-
自增运算符:使变量的值加一(下面以 i 为例)
i++:先使用后加1
++i:先加1后使用
区别:#include<stdio.h> int main() { int i=1; printf("i=%d\n",++i);//打印i的值 printf("i=%d\n",i++);//打印i的值 return 0; }
运行结果:
i=2 i=2
-
自减运算符:使变量的值减一
i- -:先使用后减1
- -i:先加1后使用
区别:与自增类似
(3)算数表达式
由算术运算符、运算对象和括号连接起来的式子,运算对象可以是常量、变量、函数等
- 表达式计算后会得到一个确定的值和类型,其类型由所使用的具体运算符和运算对象决定,例:有定义“char a=0;int b=1;float c=2;double d=3;”,则表达式“a+b+c+d”的值为 double 类型
- 乘号不能省略
- 可用多层圆括号且只能用圆括号
3. 逗号运算符和逗号表达式
(1)逗号运算符
逗号也是一种运算符,它的功能是把多个表达式连接起来组成一个表达式,即逗号表达式
(2)逗号表达式
表达式1,表达式2,… ,表达式n
-
执行顺序:从左到右依次计算每个表达式的值,并把最后一个表达式的值作为整个逗号表达式的值
-
并非所有出现逗号的地方都为逗号表达式,有的时候逗号只是用作各变量的分隔符。
代码示例:#include<stdio.h> int main() { int i,j=7; float k = 5; i = (j = j + 2, j / k); printf("i=%d\n",i); return 0; }
运行结果:
i=1
4. 求字节数运算符
sizeof(表达式)或sizeof 表达式
sizeof(数据类型名)
代码示例:
#include<stdio.h>
int main()
{
int a, b;
a = sizeof(3 + 5.0);
b = sizeof 3 + 5.0;
printf("%d,%d,%d\n", a, b, sizeof("china"));
return 0;
}
运行结果为:
8,9,6
在VS2022中:
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(char));//1
printf("%d\n", sizeof(float));//4
printf("%d\n", sizeof(double));//8
printf("%d\n", sizeof(short int));//2
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(long int));//4
printf("%d\n", sizeof(unsigned short));//2
printf("%d\n", sizeof(unsigned int));//4
printf("%d\n", sizeof(unsigned long));//4
return 0;
}
5. 关系运算符和关系表达式
(1)关系运算符
运算符 | 含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
(2)关系表达式
表达式1 关系运算符 表达式2
- “=”为赋值运算符,表赋值;“==”为关系运算符,表判断
- 非0为真,0为假,假为0,真可能为1,例:关系表达式“(a=3)>(b=8)”的值为 0
- 对实数进行相等判断可能得不到正确的结果,例:“1.0/3*3.0==1.0”的结果为0
6. 逻辑运算符和逻辑表达式
(1)逻辑运算符
运算符 | ! | && | || | |
---|---|---|---|---|
名称 | 逻辑非 | 逻辑与 | 逻辑或 |
(2)逻辑表达式
表达式1 逻辑运算符 表达式2
或 逻辑运算符 表达式1
- 在由若干子表达式组成的逻辑表达式中,从左到右计算,当计算出一个子表达式的值就确定了整个逻辑表达式的值时,此后就不再计算右边剩下的子表达式的值,这种情况被称为“短路”
- && 左右有一个表达式为假,结果为假
- || 左右有一个表达式为真,结果为真
7. 条件运算符和条件表达式
(1)条件运算符
由“ ?”和“:”两个符号组成
(2)条件表达式
表达式1 ?表达式2 : 表达式3
- 执行顺序:先计算表达式1的值,若值为非0,表达条件为真,则将表达式2的值作为整个条件表达式的值,否则,将表达式3的值作为整个条件表达式的值。例,4>3?5:7 的值为5
- 条件表达式中表达式1的类型可以与表达式2和表达式3不同,表达式2和表达式3的类型也可以不同,此时系统会自动进行转换,结果为表达式2和表达式3中级别类型较高的,并将其作为条件表达式的类型。例,“ ‘a’?1:2.0”的结果为double型的1.0
- 循序嵌套:“a>3?b:c>2?1:0”,根据条件表达式的右结合性,它相当于“a>3?b:(c>2?1:0)”