c语言数据类型详解,c语言数据类型及其运算
chanong
|在上一篇文章分享中,我们看到程序中使用的各种变量都需要提前解释,即先解释后使用。变量描述可以包括三个方面:
数据类型
存储类型
·范围
本课仅涵盖数据类型描述。其他步骤将在后续章节中介绍。所谓数据类型是根据所描述的数量的性质、表示的格式、占用的存储空间的大小以及结构特征来分类的。在C语言中,数据类型可以分为四类:基本数据类型、构造数据类型、指针类型和空类型。
1. 基本数据类型
基本数据类型最重要的特征是它的值不能分解为其他类型。也就是说,基本数据类型是自文档化的。
2. 数据类型的构造数据类型的构造
它是使用基于一种或多种定义的数据类型的构造函数方法来定义的。也就是说,构造类型的值可以分解为多个“成员”或“元素”。每个“成员”都是基本数据类型或构造类型。 C 语言具有以下构造类型。
数组型
结构型式
联合型
3.指针类型
指针是一种特殊且重要的数据类型。它的值用来表示内部存储器中特定数量的地址。虽然指针变量的值与整数类似,但不能混淆,因为它们是两种完全不同类型的量。 4.当你调用空类型的函数值时,通常需要将函数值返回给调用者。返回的函数值具有特定的数据类型,必须在函数定义和函数描述中描述。例如,在示例问题中的max 函数定义中,函数头将是: int max(int a, int b ) ;“int”类型说明符表示函数的返回值是整数。再比如,在使用库函数sin时,系统要求函数的返回值为双精度浮点类型,因此赋值语句中s=sin(x); s也是双精度浮点数point类型,必须是小数类型。由于它是点类型,因此它与sin函数的返回值匹配。因此,在描述部分,s被写成双精度浮点类型。然而,有一些类型的函数在调用函数后不需要向调用者返回函数值,这些类型的函数可以定义为“空类型”。它的类型说明符是无效的。更多细节将在第5 章中介绍。本章首先介绍基本数据类型:整型、浮点型、字符型。其余类型将在后续章节中介绍。
数量是基本数据类型,根据其值是否可以改变,分为常量和变量两种。在程序执行过程中其值不改变的量称为常量,而其值发生变化的量称为变量。可以结合数据类型进行分类。例如可以分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量可以直接引用,无需解释,但变量必须先声明后才能使用。
整数
整数包括整型常量和整型变量。整数常量就是整数常量。 C 语言使用三种类型的整数常量:八进制、十六进制和十进制。
整数常量
1. 八进制整型常量八进制整型常量必须以0 开头。即使用0作为八进制前缀。数字值为0到7。八进制数通常是无符号的。
以下数字是有效的八进制数。
015(十进制13) 0101(十进制65) 0177777(十进制65535)
以下数字不是有效的八进制数。
256(不带0 前缀) 03A2(包含非八进制数字) -0127(显示减号)
2. 十六进制整数常量
十六进制整数常量以0X 或0x 开头。数字值为0-9、A-F或a-f。
以下数字是有效的十六进制整数常量。
0X2A(十进制42) 0XA0(十进制160) 0XFFFF(十进制65535)
以下数字不是合法的十六进制整数常量。
5A(无0X前缀)0X3H(包含非十六进制数字)
3. 十进制整数常量
十进制整数常量没有前缀。其编号范围为0 到9。
以下数字是有效的十进制整数常量。
237-568 65535 1627
以下数字不是合法的十进制整数常量。
023(不能有前导零)23D(包含非十进制数字)
该程序根据前缀区分不同的基数。因此,在编写常量时,请避免使用错误的前缀,从而导致错误的结果。 4.可以表示的数字范围也受到限制,因为整数常量后缀是在16位字长的机器上,并且基本整数也是16位长。十进制无符号整数常量的范围是0 到65535,有符号数的范围是-32768 到+32767。八进制无符号数的表示范围是0 到0177777。无符号十六进制表示范围是0X0 到0XFFFF 或0x0 到0xFFFF。如果您使用的数字超出上述范围,则必须表示为长整数。长整数由后缀“L”或“l”表示。例如:
十进制长整型常数158L(十进制158) 358000L(十进制-358000)
八进制长整型常量012L(十进制10) 077L(十进制63) 0200000L(十进制65536)
十六进制长整型常量0X15L(十进制21) 0XA5L(十进制165) 0X10000L(十进制65536)
长整数158L 和基本整数常量158 之间没有数值差异。然而,在158L的情况下,由于它是一个长整数,所以C编译系统为其分配4个字节的存储空间。 158是基本整数类型,因此只分配2个字节的存储空间。因此,您应该小心操作和输出格式,以避免出现错误。整数常量中无符号数的后缀是“U”或“u”。示例:358u、0x38Au、235Lu 都是无符号数。前缀和后缀可以一起使用来表示不同类型的数字。例如,0XA5Lu 十六进制表示无符号长整数A5,十进制表示165。
整型变量
整型变量可以分为以下几类:
1.基本型
类型说明符是int,占用内存2个字节,其值为基本整型常量。
2. 短整型
类型说明符是short int 或short'C110F1。占用字节数和取值范围与基本类型相同。
3.长整型
类型说明符为long int或long,在内存中占用4个字节,其值为长整型常量。
4.无符号类型
类型说明符是无符号的。
将以上三种类型匹配即可形成无符号类型。
(1)无符号基本类型类型说明符为unsigned int或unsigned。
(2) unsignedshort 整数类型说明符是unsignedshort。
(3) 无符号长整数类型说明符为unsigned long。
不同的无符号类型与其对应的有符号类型占用相同字节数的内存空间。但是,由于省略了符号位,因此无法表示负数。下表显示了Turbo C 中分配给各种整数类型的内存字节数以及这些数字的表示范围。
类型说明符的数量范围分配的字节数
整数-32768~32767
短整型-32768~32767
有符号整型-32768~32767
无符号整型0~65535
长整型-2147483648~2147483647
无符号长整型0~4294967295
整型变量描述
变量描述的一般格式为:类型说明符、变量名标识符、变量名标识符、……;例如:
int a,b,c; (a,b,c 是整型变量)
long x,y;(x,y 是长整型变量)
unsigned p,q;(p,q 是无符号整型变量)
编写变量声明时,应记住以下几点:
1.允许在类型说明符后指定多个相同类型的变量。用逗号分隔变量名称。类型说明符和变量名之间必须至少有一个空格。
2. 最后一个变量名必须以“;”结尾。
3、变量描述必须放在变量使用之前。通常放在函数体的开头。
[练**] //1int a,b;
短整型c;
短d=100;
a=d-20;
b=a+d;
c=a+b+d;
d=d-a+c-b;'V表
一、2、0
b,2,0
c,2,0
天,2,100
V表
'V更新
1,0;2,0
3,0
4,100
1,80
2,180
3,360 人
4,200
更新
实际的
【练**】 //2int a=5;
整数b=9;
长整数c;
长d;
c=a+b-7;
d=a*b*c;
c=d*d*d;
a=c-d;'虚拟表
啊,2、5
乙、2、9
c,4,0
d,4,0
V表
'V更新
1,5
2,9
3,0
4,0
3,7
4,315
3,31255875
1,-5112
更新
实际的
【练**】 //3int a=6,b=19;
无符号整型c;
整数d;
c=a-b+7;
d=b*c;
a=b+c+d;
b=-a;'V表
啊,2、6
b,2,19
c,2,0
d,2,0
V表
'V更新
1,6;2,19
3,0
4,0
3,65530
4、-114
1、-101
2,101
更新
实际的
无效主(){
长x,y;
整数a、b、c、d;
x=5;
y=6;
a=7;
b=8;
c=x+a;
d=y+b;
printf('c=x+a=%d,d=y+b=%d\n',c,d);
}
将main 写成返回void,即不返回任何类型的值。
x, y 被定义为long 类型
a、b、c、d 定义为int 类型
5次
6岁
7-a
8-b
x+a-c
y+b-d
显示长x,y程序的执行结果。
整数a、b、c、d;
c=x+a;
d=y+b;
从程序中可以看出,x、y是长整型变量,a、b是基本整型变量。它们之间可以进行运算,结果将是长整型。但是,由于c 和d 被定义为基本整数类型,因此最终结果也是基本整数类型。这个例子说明了不同类型的量可以参与一个运算并互相赋值。类型转换由编译系统自动完成。类型转换的规则稍后介绍。
实际金额
实常数
实数也称为浮点类型。实常数也称为实数或浮点数。在C语言中,实数仅使用十进制表示法。它有两种格式:十进制格式、指数格式
1.十进制格式
它由数字0 到9 和小数点组成。示例:0.0、25、5.789、0.13、5.0、300.-267.8230 等都是合法实数。
2. 指数格式
它由一个十进制数、一个指数代码符号“e”或“E”以及一个指数代码(仅限整数,可以带符号)组成。其一般形式为E n(其中a为十进制数,n为十进制整数),其值为a*10,n。示例:2.1E5(等于2.1*10,5)、3.7E-2(等于3.7*10,)-2*) 0.5E7(等于0.5*10,7)、-2.8E-2(-2.8 *10) -2*) 以下不是合法实数: 345(无小数点) E7(无指数符号E) -5(无代码符号) 53.-E3(减号位置错误) 2.7E(无代码)
标准C 允许浮点后缀。后缀“f”或“F”表示该数字是浮点数。例如,356f 和356. 是等效的。例2.2 说明了这种情况。
无效主函数()
{
printf('%f\n%f\n',356.356f);
}
void 指定main 不返回任何值。使用printf 显示结果。
实变量
实数变量分为两类:单精度和双精度。
其类型说明符是float 单精度说明符和double 双精度说明符。在Turbo C中,单精度类型占用4字节(32位)的内存空间,它们的值范围从3.4E-38到3.4E+38,并且只能提供7位有效数字。双精度类型占用8个字节(64位)的内存空间,其取值范围为1.7E-308到1.7E+308,可以提供16位有效数字。
实数类型变量声明的格式和编写规则与整数类型相同。
示例:float x,y;(x,y 是单精度实数)
double a,b,c;(a,b,c 是双精度实数)
实数常量不分单精度和双精度,都按双精度处理。
无效主函数()
{
浮动一个;
双b;
a=33333.33333;
b=33333.333333333333333;
printf('%f\n%f\n',a,b);
}
该程序解释了float 和double 之间的区别
一---33333.33333
b---33333.33333333333;
查看计划结果
该程序解释了float 和double 之间的区别
浮动一个;
双b;
a=33333.33333;
b=33333.33333333333333; 从这个例子中可以看出,a是单精度浮点类型,因此它只有7位有效数字。该整数已占5 位,因此小数点后2 位之后的任何数字均无效。 b 是有效的16 位双精度类型。但Turbo C规定保留小数点后第6位,其余四舍五入。
【练**】 //floatint a=32;
浮动b;
双d;
b=12345678;
d=b*100;
d=d+a;
d=d+58.123456;'V表
啊, 2, 32
b,4,0.0
d,8,0.0
V表
'V更新
1,32
2,0
3,0
2,12345678.00000
3,1234567800
3,1234567832
3,1234567890.123456
更新
实际的
【练**】 //1int a=543;
浮动b;
b=123.123962+a;
b=b-100;
a=b;'V表
啊,2,543
b,4,0.0
V表
'V更新
1,543
2,0.0
2,123.123962
2,23.123962
1,23
更新
实际的
字符类型
字符量包括字符常量和字符变量。
字符常数
字符常量是用单引号括起来的字符。例如,“a”、“b”、“=”、“+”和“”都是有效的字符常量。在C语言中,字符常量有以下特点:
1.字符常量只能用单引号括起来,不能用双引号或其他括号括起来。
2. 字符常量只能包含单个字符。不允许使用字符串。
3、字符可以是字符集中的任意字符。但是将数字定义为字符类型之后,
不能参与数值计算。例如,“5”和5是不同的。由于“5”是字符常量,因此不能参与计算。
转义字符
转义字符是特殊字符常量。转义字符以反斜杠“\”开头,后跟一个或多个字符。转义字符之所以被称为“转义”字符,是因为它们具有不同于字符原始含义的特定含义。例如,上例中printf 函数的格式字符串中使用的“\n”是转义字符,意思是“回车换行”。转义字符主要用于表示难以用常规字符表示的控制代码。
常用转义字符及其含义
转义字符转义字符的含义
\n回车换行
\t 水平跳转到下一个制表符位置
\v 垂直制表符
\b 退格键
\r请输入
\f送纸和换页
\\ 反斜杠字符'\'
\' 单引号字符
\a 请按铃
\ddd 表示为从1 到3 的八进制数的字符
\xhh 表示为1 到2 的十六进制数的字符
广义上讲,C语言字符集中的任何字符都可以用转义字符来表示。为此,建议使用表2.2 中的\ddd 和\xhh。 ddd 和hh 分别是八进制和十六进制ASCII 代码。例如,\101 代表单词“A”,\102 代表字母“B”,\134 代表反斜杠,\XOA 代表新行。使用转义字符
无效主函数()
{
整数a、b、c;
a=5;b=6;c=7;
printf('%d\n\t%d %d\n %d %d\t\b%d\n',a,b,c,a,b,c);
}
该程序将练**使用转义字符
a、b、c 是整数5-a、6-b、7-c
调用printf显示程序执行结果
printf('%d\n\t%d %d\n %d %d\t\b%d\n',a,b,c,a,b,c);
程序在第一列中打印值5 后,有一个“\n”,因此键入它以换行,然后键入“\t”,以便跳到下一个制表位(将制表位间距设置为8 )) ,输出b 值为6。清空两个空格并打印c 值7,然后键入'\n' 以开始新行。再次清空这两个空格并打印值5。再次清空三个空格并打印b 值。 6; 再次'\t'跳转到下一个制表符位置(与上一行的6对齐),但是下一个转义字符'\b'向后移动一个空格,因此紧邻6的c值7将被输出到。
字符变量
字符变量的值是字符常量,即单个字符。字符变量的类型说明符是char。字符变量类型的书写格式和规则与整型变量相同。
例如:
char a,b; 每个字符变量分配1个字节的内存,因此只能存储1个字符。字符值以ASCII码的形式存储在可变存储单元中。 等
y 的十进制ASCII 代码为120,y 的十进制ASCII 代码为121。将'x'和'y'的值赋给字符变量a和b:a='x';b='y'; 实际上,二进制代码120和121分别存储在两个单元a和b中。 0 1 1 1 1 0 0 0
b 0 1 1 1 1 0 0 1
因此,它们也可以被视为整数。在C语言中,可以将字符值赋给整型变量,也可以将整型值赋给字符变量。输出时,字符变量可以输出为整数,整数也可以输出为字符。整数值是全角值,字符值是半角值,当将整数值作为字符值处理时,只涉及低八位字节的处理。
主要的()
{
字母a、b;
a=120;
b=121;
printf('%c,%c\n%d,%d\n',a,b,a,b);
}
a b
一个——120
乙---121
查看计划结果
在这个程序中,a和b是字符类型,但赋值语句中赋值的是整数值。从结果来看,a和b的值的输出格式取决于printf函数的格式字符串中的格式字符。如果格式字符为“c”,则对应的输出变量的值是一个字符。如果格式字符为',则对应的输出变量的值为字符。 d',对应的输出值为:变量值是整数。
无效主函数()
{
字母a、b;
a='x';
b='y';
a=a-32;
b=b-32;
printf('%c,%c\n%d,%d\n',a,b,a,b);
}
a、b 被声明为字符变量并分配字符值。
将小写字母转换为大写字母
以整数和字符类型输出
在这个例子中,a和b被写为字符变量并分配字符值,但是C语言允许字符变量参与数值运算,并且可以使用字符的ASCII码来这样做。 ASCII码的大小写相差32位,所以运算后小写字母会转换为大写。然后分别以整数和字符类型输出。
[练**] //charint a=49;
字母b;
字母d;
b=a+10;
d=a+b;'V表
啊, 2, 49
b,1,随机
d,1,随机
V表
'V更新
1,49
2、随机
3、随机
2、';'
3、“乐”
更新
实际的
[练**] //char c1,c2;
c1='a';c2='b';
c1=c1-32;c2=c2-32;'V表
c1,1,随机
c2,1,随机
V表
'V更新
1、随机;2、随机
1,'a';2,'b'
1、'A';2、'B'
更新
实际的
字符串常量
字符串常量是用双引号括起来的字符序列。例如,“CHINA”、“C Program:”、“$12.5”等都是有效的字符串常量。字符串常量和字符常量是不同的量。它们之间的主要区别是:
1、字符常量用单引号括起来,字符串常量用双引号括起来。
2. 字符常量只能包含一个字符,而字符串常量可以包含一个或多个字符。
3. 可以将字符常量赋值给字符变量,但不能将字符串常量赋值给字符变量。 C语言中没有对应的字符串变量。
这与BASIC 语言不同。但是,您可以使用字符数组来存储字符串常量。这在数组章节中有介绍。
4、字符常量占用1字节内存空间。字符串常量占用的内存字节数等于字符串中的字节数加一。添加的字节中存储字符“\0”(ASCII 码为0)。这是字符串符号的结尾。例如字符串“C程序”在内存中占用的字节数为:C程序\0。字符常量'a'和字符串常量'a'都只有一个字符,但它们在内存中的情况不同。
'a'在内存中占用1个字节,可以表示为:
'a'在内存中占用2个字节,可以表示为:a\0符号常量
符号常数
C 语言允许使用标识符来表示常量,称为符号常量。符号常量在使用之前必须先定义,其一般形式为:
#定义标识符常量
其中,#define也是一条预处理命令,称为宏定义命令(所有预处理命令均以“#”开头)(详细内容将在第九章预处理程序中介绍),其作用作为常量如下。一个标识符。价值。一旦定义,程序中所有后续出现的标识符都将替换为常量值。通常使用大写字母表示符号常量标识符,使用小写字母表示变量标识符。
#definePI 3.14159
无效主函数()
{
浮点数s,r;
r=5;
s=PI*r*r;
printf('s=%f\n',s);
}
宏定义命令中PI定义为3.14159s,r定义为实数5-r PI*r*r-s。
显示程序结果float s,r;s=PI*r*r 相当于s=3.14159*r*r。请注意,符号常量不是变量,它们表示的值不能跨范围更改。也就是说,您不能在程序中使用赋值语句重新分配。
变量的初值和类型转换
为变量分配初始值
程序常常需要给变量赋初始值才能使用它们。语言程序中有多种方法,定义时赋值初始值的方法称为初始化。在变量声明中分配初始值的一般格式是:
类型说明符变量1=值1,变量2=值2,示例:
int a=b=c=5;
浮点数x=3.2,y=3f,z=0.75;
char ch1='K',cp='P';
请注意,规范不允许连续赋值,例如a=b=c=5。这是非法的。
无效主函数()
{
int a=3,b,c=5;
b=a+c;
printf('a=%d,b=%d,c=%d\n',a,b,c);
}
a---3、b---0、c---5
b--a+c
显示程序执行结果
变量类型转换
您可以转换变量的数据类型。转换方式有两种:自动转换和强制转换。
自动转换
自动转换发生在不同数据类型混合时,由编译系统自动完成。自动转换遵循以下规则:
1. 如果操作数类型不同,请先将其转换为相同类型后再进行运算。
2. 向增加数据长度而不降低精度的方向进行转换。例如,当进行int类型和long类型之间的运算时,在进行运算之前将int数量转换为long类型。
3. 所有浮点运算均以双精度执行,因此即使仅包含float 单精度运算的表达式也必须在运算前转换为double 类型。
4、char、short类型参与运算时,必须先转换为int类型。
5. 在赋值操作中,如果赋值号两侧的数量的数据类型不同,则将赋值号右侧的数量类型转换为左侧的数量类型作业编号。如果右侧的数据类型长度比左侧长,则会缺失部分数据,导致准确度下降,因此对缺失部分进行四舍五入。自动类型转换的规则如图2.1所示。
无效主函数()
{
浮点PI=3.14159;
int s,r=5;
s=r*r*PI;
printf('s=%d\n',s);
}
PI--3.14159
s--0, r--5
s--r*r*PI
显示程序执行结果
浮点PI=3.14159;
int s,r=5;
s=r*r*PI;
在此示例程序中,PI 为实数类型,s 和r 为整数类型。当执行s=r*r*PI语句时,r和PI转换为double计算,结果也是double。但是,由于s 是整数类型,因此赋值结果仍然是截去小数部分的整数类型。
投掷
强制类型转换是通过类型转换操作来实现的。其一般形式为:(类型说明符)(表达式) 其作用是将表达式的结果强制转换为类型说明符所表示的类型。示例: (float) a 将a 转换为实数类型(int)(x+y) 将x+y 的结果转换为整数类型使用强制转换时,应注意以下问题:
1、类型说明符和表达式都必须用括号括起来(单个变量不能用括号括起来)。例如,将(int)(x+y) 写为(int)x+y 意味着将x 转换为int 类型,然后使用它。 y 被添加。
2、强制转换和自动转换都只是根据本次操作的需要暂时转换变量的数据长度,而不会改变写入数据时为变量定义的类型。
主要()
{
f
loat f=5.75; printf("(int)f=%d,f=%f\n",(int)f,f); } f<--5.75 将float f强制转换成int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f,f); 本例表明,f虽强制转为int型,但只在运算中起作用, 是临时的,而f本身的类型并不改变。因此,(int)f的值为 5(删去了小数)而f的值仍为5.75。 基本运算符和表达式 运算符的种类、优先级和结合性 C语言中运算符和表达式数量之多, 在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。 这也是C语言的主要特点之一。 C语言的运算符不仅具有不同的优先级, 而且还有一个特点,就是它的结合性。在表达式中, 各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约, 以便确定是自左向右进行运算还是自右向左进行运算。 这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。 运算符的种类C语言的运算符可分为以下几类: 1.算术运算符 用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。 2.关系运算符 用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。 3.逻辑运算符 用于逻辑运算。包括与(&&)、或(||)、非(!)三种。 4.位操作运算符 参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。 5.赋值运算符 用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。 6.条件运算符 这是一个三目运算符,用于条件求值( :)。 7.逗号运算符 用于把若干表达式组合成一个表达式(,)。 8.指针运算符 用于取内容(*)和取地址(&)二种运算。 9.求字节数运算符 用于计算数据类型所占的字节数(sizeof)。 10.特殊运算符 有括号(),下标[],成员(→,.)等几种。 优先级和结合性 C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。 而在一个运算量两侧的运算符优先级相同时, 则按运算符的结合性所规定的结合方向处理。 C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z则y应先与“-”号结合, 执行x-y运算,然后再执行+z的运算。这种自左至右的结合方向就称为“左结合性”。而自右至左的结合方向称为“右结合性”。 最典型的右结合性运算符是赋值运算符。如x=y=z,由于“=”的右结合性,应先执行y=z再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 算术运算符和算术表达式基本的算术运算符 1.加法运算符“+”加法运算符为双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。 2.减法运算符“-”减法运算符为双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。 3.乘法运算符“*”双目运算,具有左结合性。 4.除法运算符“/”双目运算具有左结合性。参与运算量均为整型时, 结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。 void main(){ printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); } 双目运算具有左结合性。参与运算量均为整型时, 结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。 printf("\n\n%d,%d\n",20/7,-20/7); printf("%f,%f\n",20.0/7,-20.0/7); 本例中,20/7,-20/7的结果均为整型,小数全部舍去。而20.0/7和-20.0/7由于有实数参与运算,因此结果也为实型。 5.求余运算符(模运算符)“%”双目运算,具有左结合性。要求参与运算的量均为整型。 求余运算的结果等于两数相除后的余数。 void main(){ printf("%d\n",100%3); } 双目运算,具有左结合性。求余运算符% 要求参与运算的量均为整型。本例输出100除以3所得的余数1。 自增1,自减1运算符 自增1运算符记为“++”,其功能是使变量的值自增1。自减1运算符记为“--”,其功能是使变量值自减1。自增1,自减1运算符均为单目运算,都具有右结合性。可有以下几种形式: ++i i自增1后再参与其它运算。--i i自减1后再参与其它运算。 i++ i参与运算后,i的值再自增1。 i-- i参与运算后,i的值再自减1。 在理解和使用上容易出错的是i++和i--。 特别是当它们出在较复杂的表达式或语句中时,常常难于弄清,因此应仔细分析。 void main(){ int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); } i<--8 i<--i+1 i<--i-1 i<--i+1 i<--i-1 i<--i+1 i<--i-1 int i=8; printf("%d\n",++i); printf("%d\n",--i); printf("%d\n",i++); printf("%d\n",i--); printf("%d\n",-i++); printf("%d\n",-i--); i的初值为8 第2行i加1后输出故为9; 第3行减1后输出故为8; 第4行输出i为8之后再加1(为9); 第5行输出i为9之后再减1(为8) ; 第6行输出-8之后再加1(为9); 第7行输出-9之后再减1(为8) void main(){ int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); printf("%d,%d,%d,%d",p,q,i,j); } i<--5,j<--5,p<--0,q<--0 i+i+i--->p,i+1-->i,i+1-->i,i+1-->i j+1->j,j+1->j,j+1->j,j+j+j->q int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); 这个程序中,对P=(i++)+(i++)+(i++)应理解为三个i相加,故P值为15。然后i再自增1三次相当于加3故i的最后值为8。而对于q 的值则不然,q=(++j)+(++j)+(++j)应理解为q先自增1,再参与运算,由于q自增1三次后值为8,三个8相加的和为24,j的最后值仍为8。算术表达式表达式是由常量、变量、函数和运算符组合起来的式子。 一个表达式有一个值及其类型, 它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。 单个的常量、变量、函数可以看作是表达式的特例。 算术表达式 是由算术运算符和括号连接起来的式子, 以下是算术表达式的例子: a+b (a*2)/c (x+r)*8-(a+b)/7++i sin(x)+sin(y) (++i)-(j++)+(k--) 赋值运算符和赋值表达式 简单赋值运算符和表达式,简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为: 变量=表达式 例如: x=a+b w=sin(a)+sin(b) y=i+++--j 赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此 a=b=c=5 可理解为 a=(b=(c=5)) 在其它高级语言中,赋值构成了一个语句,称为赋值语句。 而在C中,把“=”定义为运算符,从而组成赋值表达式。 凡是表达式可以出现的地方均可出现赋值表达式。例如,式子x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x ,故x应等于13。 在C语言中也可以组成赋值语句,按照C语言规定, 任何表达式在其未尾加上分号就构成为语句。因此如x=8;a=b=c=5;都是赋值语句,在前面各例中我们已大量使用过了。 如果赋值运算符两边的数据类型不相同, 系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下: 1.实型赋予整型,舍去小数部分。前面的例2.9已经说明了这种情况。 2.整型赋予实型,数值不变,但将以浮点形式存放, 即增加小数部分(小数部分的值为0)。 3.字符型赋予整型,由于字符型为一个字节, 而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。 4.整型赋予字符型,只把低八位赋予字符量。 void main(){ int a,b=322; float x,y=8.88; char c1='k',c2; a=y; x=b; a=c1; c2=b; printf("%d,%f,%d,%c",a,x,a,c2); } int a,b=322; float x,y=8.88; char c1='k',c2; printf("%d,%f,%d,%c",a=y,x=b,a=c1,c2=b); 本例表明了上述赋值运算中类型转换的规则。a为整型,赋予实型量y值8?88后只取整数8。x为实型,赋予整型量b值322, 后增加了小数部分。字符型量c1赋予a变为整型,整型量b赋予c2 后取其低八位成为字符型(b的低八位为01000010,即十进制66,按ASCII码对应于字符B)。 复合赋值符及表达式 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如 +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。 构成复合赋值表达式的一般形式为: 变量 双目运算符=表达式 它等效于 变量=变量 运算符 表达式 例如: a+=5 等价于a=a+5x*=y+7 等价于x=x*(y+7)r%=p 等价于r=r%p 复合赋值符这种写法,对初学者可能不**惯, 但十分有利于编译处理,能提高编译效率并产生质量较高的目标代码。逗号运算符和逗号表达式在 逗号运算符 C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。 其一般形式为: 表达式1,表达式2 其求值过程是分别求两个表达式的值,并以表达式2的值作为整个逗号表达式的值。 void main(){ int a=2,b=4,c=6,x,y; x=a+b,y=b+c; printf("y=%d,x=%d",y,x); } a<--2,b<--4,c<--6,x<--0,y<--0 x<--a+b,y<---b+c 本例中,y等于整个逗号表达式的值,也就是表达式2的值,x是第一个表达式的值。对于逗号表达式还要说明两点: 1.逗号表达式一般形式中的表达式1和表达式2 也可以又是逗号表达式。例如: 表达式1,(表达式2,表达式3) 形成了嵌套情形。因此可以把逗号表达式扩展为以下形式: 表达式1,表达式2,…表达式n 整个逗号表达式的值等于表达式n的值。 2.程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。 3.并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用作各变量之间的间隔符。 [Practice] //arithmeticint a,b,c; float d; a=11; b=235; c=a+b-a*b; d=(float)c/(float)a; a=c/a;'Vtable a,2,0 b,2,0 c,2,0 d,4,0.0 of Vtable 'Vupdate 1,0;2,0;3,0 4,0.0 1,11 2,235 3,-2339 4,-212.636368 1,-212 of Vupdate of Practice [Practice] //1int a,b,c1,c2; a=25; b=3243; c1=b/a; c2=b%a;'Vtable a,2,0 b,2,0 c1,2,0 c2,2,0 of Vtable 'Vupdate 1,0;2,0;3,0;4,0 1,25 2,3243 3,129 4,18 of Vupdate of Practice [Practice] //1int a,b,c; a=25; b=40; c=a+b,c+35;'Vtable a,2,0 b,2,0 c,2,0 of Vtable 'Vupdate 1,0;2,0;3,0 1,25 2,40 3,65 of Vupdate of Practice 小结 1.C的数据类型 基本类型,构造类型,指针类型,空类型 2.基本类型的分类及特点 类型说明符 字节 数值范围 字符型char 1 C字符集 基本整型int 2 -32768~32767 短整型short int 2 -32768~32767 长整型 long int 4-214783648~214783647 无符号型 unsigned 20~65535 无符号长整型 unsigned long 4 0~4294967295 单精度实型 float 4 3/4E-38~3/4E+38 双精度实型 double 8 1/7E-308~1/7E+308 3.常量后缀 L或l 长整型 U或u 无符号数 F或f 浮点数 4.常量类型 整数,长整数,无符号数,浮点数,字符,字符串,符号常数,转义字符。 5.数据类型转换 ·自动转换 在不同类型数据的混合运算中,由系统自动实现转换, 由少字节类型向多字节类型转换。 不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型。 ·强制转换 由强制转换运算符完成转换。 6.运算符优先级和结合性 一般而言,单目运算符优先级较高,赋值运算符优先级低。 算术运算符优先级较高,关系和逻辑运算符优先级较低。 多数运算符具有左结合性,单目运算符、三目运算符、 赋值 7.表达式 表达式是由运算符连接常量、变量、函数所组成的式子。 每个表达式都有一个值和类型。 表达式求值按运算符的优先级和结合性所规定的顺序进行。







