(1)运算对象的数目
C语言中,运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。
(2)运算符的位置
单目运算符若放在运算对象的前面,称为前缀运算符;若放在运算对象的后面,称为后缀运算符。
双目运算符都是放在两个运算对象的中间,称为中缀运算符。
三目运算符在C语言中只有一个(?:),是夹在三个运算对象之间的。
(3)运算对象的数据类型
每个运算符对每个运算对象的数据类型均有明确的要求,如果运算对象的数据类型不正确,则可能会出现语法上的错误,或者运算结果错误。
(4)运算规则
每个运算符有特定的运算规则,即对运算对象进行什么样的运算或加工加工。
(5)运算结果的数据类型
每个运算符的运算结果也有确定的数据类型。
运算结果的数据类型一般称为运算符的数据类型。例如,运算结果是数值型的运算符称为算术运算符,运算结果是逻辑值(真或假)的称为关系运算符或逻辑运算符等等。
(6)运算符的优先级。
当用多个运算符连接了多个运算对象时,就会碰到哪个运算符先算,哪个运算符后算的问题,我们把这个问题称为运算符的优先级。
C语言规定了每个运算符的优先级别,并规定优先级高的运算符要先计算。同时,还规定了圆括号的优先级别高于任何运算符,即用圆括号括住的部分首先计算。若在圆括号中又有圆括号,则内层圆括号优先于外层圆括号。
(7)运算符的结合性。
优先级别相同的运算符也会出现先算和后算的问题,在C语言中称为“结合性”。
C语言规定了同级别运算符的结合性有两种:自左向右和自右向左。若结合性是“自左向右”的,则按照自左向右的顺序,先碰到谁先算谁;若结合性是“自右向左”的,则按照自右向左的顺序,先碰到谁先算谁。
(8)下列少数运算符号有双重含义:
+ 在算术运算中既表示“取正”运算, 又可表示“加法”运算;在指针运算中表示“加法”运算。
- 在算术运算中既表示“取负”运算, 又可表示“减法”运算;在指针运算中表示“减法”运算。
* 在算术运算中表示“乘法”运算;在指针运算中表示“指针”运算。
& 在位逻辑运算中表示“与”运算;在指针运算中表示“取地址”运算。
表达式是用运算符把运算对象连接起来组成的合法运算式。其中的运算对象可以是常量、变量,也可以是表达式,从而能构造出非常复杂的表达式。
(1)正确构造表达式的规则如下:
1、单个的常量、变量、函数调用都是表达式;
2、前缀单目运算符 表达式
3、表达式 后缀单目运算符
4、表达式 双目运算符 表达式
5、表达式?表达式:表达式(其中的? :是三目运算符)
6、有限次使用上述规则获得的运算式也是表达式。
(2)表达式计算中数据类型的自动转换规则:
上述转换规则可以简称“就长不就短”的自动转换规则。即首先将参加运算的两个运算对象中,数据长度短的运算对象自动转换成数据长度长的数据类型,然后进行计算。计算结果值当然就是数据长度长的运算对象的数据类型。
(3)表达式的运算规则
表达式的运算规则其实就是其中运算符的运算规则及其优先级和结合性。
构造表达式时,在需要的地方可以用增加圆括号的方式来改变计算的顺序。
(4)表达式的值
每个表达式都可以按照运算规则进行运算,并最终获得一个值,称为表达式值。
要特别注意C语言的任何表达式都有值。
(5)表达式的类型
表达式值的数据类型就称为表达式类型。
就已经学过的知识来看,C语言表达式的类型只有字符型、整型、实型。其中字符型和整型可以合称为整型表达式,整型表达式和实型表达式又可以合称为数值型表达式。以后还会学习指针(地址)型表达式等。
(6)表达式的分类
从构成表达式的运算符来划分,C语言的表达式可以分为:算术表达式、赋值表达式、关系表达式、逻辑表达式、逗号表达式和条件表达式等。
当表达式中出现多个运算符时,按优先级和结合性最后一个计算的运算符就是区分表达式类别的。例如,最后计算的是“算术运算符”,则是算术表达式;最后一个计算的是“赋值运算符”,则是赋值表达式。
(1)算术运算符的优先级别规定如下:
● 单目基本算术运算符 优先于 双目基本算术运算符。
● *、/、% 优先于 +(加)、-(减)。
● +(取正)、-(取负) 是同级别的,结合性是自右向左的。
● *、/、% 是同级别的,结合性是自左向右的。
● +(加)、-(减) 是同级别的,结合性是自左向右的。
说明:
1、对于除( / ):两整数相除,结果为整数,有一个为实型,结果为实型。要求分母不为0。
2、对于模(%):要求两侧均为整型数据,余数符号与被除数相同。
例 5/2 = 2
-5/2.0 = -2.5
5%2 = 1
5%-2 = 1
-5%2 = -1
-5%-2 = -1
1%-10 = 1
5%1 = 0
5.5%2 (错)
(2)增1减1运算符
++ --可以前置,也可以后置。
前置 ++i, --i (先增减后引用)
后置 i++,i-- (先引用后增减)
int a, i=1;
a=i++; //表达式值1,a=1,i=2
a=++i; //表达式值2,a=2,i=2
使用增1减1运算符时,需要注意下列几点:
程序:
j=2;k=++j; /*j=3 k=3*/
j=2;k=j++; /*j=3 k=2*/
j=2;printf(“%d %d\n”, j++,++j ); /*3 3 printf语句表达式是从右至左执行*/
j=2;printf("%d %d\n", ++j,j++ ); /*3 2*/
j=2,k=1;
printf("%d...", j+++k ); /*3...*/
j=2,k=1;
printf("%d\n", (j++)+k );/*3...*/
}
(1)关系运算符:
(2)注意区分“=”与“==”
#include
void main( void )
{
int a=0,b=1;
if(a=b) //a=b结果为1
printf("a equal to b\n");
else
printf("a not equal to b\n");
}
#include
void main( void )
{
int a=0,b=1;
if(a==b) //a==b结果为0
printf("a equal to b\n");
else
printf("a not equal to b\n");
}
(1)逻辑运算符
a | b | !a | !b | a&&b | a//b |
---|---|---|---|---|---|
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
0 | 非0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
例如程序:
#include
void main( void )
{
int a=1, b=2, c=3, d=4, m=1, n=1;
(m=a>b)&& (n=c>d);
printf(" m=%d n=%d\n", m, n );
}
运行解果: 分析:(m=a>b)的结果为0,0和任意表达式“与”运算均为0,故n=c>d没有运算,n的值仍为1!
例 a=3*5,a*4 //a=15,表达式值60
a=3*5,a*4,a+5 //a=15,表达式值20
例 x=(a=3,6*3) //赋值表达式,表达式值18,x=18
x=a=3,6*a //赋值表达式,表达式值18,x=3
格式: e1 ? e2 : e3
(1)长度运算符(sizeof)
设变量定义如下:char c; int i; short s;
long l; float f; double d;
则: sizeof(c)的值是1 sizeof(i)的值是4
sizeof(s)的值是2 sizeof(l)的值是4
sizeof(f)的值是4 sizeof(d)的值是8
sizeof(unsigned int)的值是4
sizeof(unsigned short)的值是2
sizeof(unsigned long)的值是4
(2)数据类型转换运算符(强制类型转换)
设变量定义如下:
char c=1; int i=2; short s=3;
long l=4; float f=5.0; double d=6.0;
则:
(float)c的值是1.0,单精度实型,而c的值仍然是1,字符型。
(short)l的值是4,带符号的短整型,而变量l仍然是4,带符号长整型。
(int)(s/f)的值是0,带符号整型,变量s和f的类型与值均不改变。
(int)s/f的值是0.6,双精度实型,变量s和f的类型与值均不改变。
(long)(i+d)的值是8,带符号长整型,变量i和d的类型与值均不改变。