C语言 运算符与表达式
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 main() 精度损失问题 { float x; int i; 较高类型向较低类型转换时可能发生 x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); } 结果:x=3.600000,i=3
注意:
C语言算术表达式的书写形式与数学表达式的书写形式 有一定的区别:
(1) C语言算术表达式的乘号(*)不能省略。例如:数 学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。 (2) C语言表达式中只能出现字符集允许的字符。例如, 数学π r2相应的C表达式应该写成:PI*r*r。(其中PI是已 经定义的符号常量) (3)C表达式中的内容必须书写在同一行,不允许有分子 分母形式,必要时要利用圆括号保证运算的顺序。
Example:
j = i++ - 2
similar to
i
5 6 ?? 3
j = i – 2;
i = i + 1;
j
自右向左 结合性: 例: 分析: (1)++、--、+(正号)、-(取负)是同级 运算符,结合方向:自右向左。 (2) -i++等价于-(i++) i = 2; j = -i++;
例如:数学式
(4) C语言算术表达式只使用圆括号改变运算的优先顺序 (不要指望用{}[])。可以使用多层圆括号,此时左右括 号必须配对,运算时从内层括号开始,由内向外依次计算 表达式的值。
a+b c+d
相应的C表达式应写成:(a+b)/(c+d)。
四、赋值运算符和赋值表达式
1、赋值运算符 2、赋值表达式 用赋值运算符将变量和表达式连接 起来的式子 形式: <变量>=<表达式> 求值规则: 将“=”右边表达式的值赋 给左边的变量。 结合性:自右至左
(2)自右向左结合,。
(3)常用于循环语句中控制循环次数 ( 4 ) 单独使用时 ++i;
等 价
i++;
等 价
i=i+1;
良好的程序设计风格提倡:在一行语句中, 一个变量只能出现一次增1或者减1运算。过多
的增1和减1运算混合,不仅可读性差,而且因
为编译器实现的方法不同,导致不同编译器产 生不同的运行结果。
ch/i
int
int
+
f*d - (f+i)
double double
double double
int
double double
double
double
double
double
自动转换原则
1、 低级别的数可存入高级别的变量中, 反之不行。因为高级别变量的存储容量大。 2、当不同类型的数据混合运算时,系统先 看哪个数据的类型最高,然后将其他数据均 转换成这个类型,再进行计算。
4、各类数值型数据间的混合运算
一. 在C语言中,整型、实型和字符型数据间可以混合 运算(因为字符数据与整型数据可以通用)。 如果一个运算符两侧的操作数的数据类型不同,则系统 按“先转换、后运算”的原则,转换的方法有两种:自动转 换(隐式转换);强制转换。 1、自动转换(隐式转换) 自动转换发生在不同类型数据进行混合运算时,由编译 系统自动完成。转换规则:(参看下页图示) (1) 类型不同,先转换为同一类型,然后进行运算。 (2)图中纵向的箭头表示当运算对象为不同类型时转 换的方向。可以看到箭头由低级别数据类型指向高级别数据 类型,即数据总是由低级别向高级别转换。即按数据长度增 加的方向进行,保证精度不降低。
例2-12: a 4 4 4 5 b 5 5 5 5 y 4 9 5 5
逗号表达式
y=a=4,b=5,a+b; y=(a=4,b=5,a+b); y=(a=4,b=5),a+b; y=a=(4,b=5),a+b;
9 9 9 10
又:int a=1,b; b=(a++,3+2,a+=1,a--);
a=2,b=3
注意:并不是任何地方出现的逗号都是逗号运算符。 如:printf(“%d,%d\n”,a,b);
【例3-13】
main() { int a=1;
没有结果,因没输出符
printf(“结果为:%d\n”,a=4*a,3*a);
}
分隔符
结果为:4
printf(“结果为:%d\n”,(a=4*a,3*a ));
int total, number; float average; … average = (float)total / number;
total
15 2
15.000000 / 2 7.500000
number
?? average 7.500000
说明:
1、强制类型 转换比自动类型转换级别高。 2、高级别的 数据赋值给低级别的变量,若数 据超过变量的宽度,结果有误差或出错。
的结果为“假”,即条件不成立。
注意书写两个符号的关系运算符,期 间不要间隔。
(算术、关系、逻辑、赋值、字符)
C语言没有逻辑型数据,以1代表“真”,
以“0”代表“假”。因此,关系表达式的值,
还可以参与其它种类的运算,例如算术运算、 逻辑运算等。
又例如:变量 a=3, b=2, c=1, 则下列表达式及其值是: a > b (真) b + c < a (假) f = a > b > c a > b == c (真) d= a> b (d 的值为1 (f 值为0)
/=
%=
num /= 5;
num %= 5;
num = num / 5;
num = num % 5;
复合运算符是一个运算符,但功能上,是两个运算符 功能的组合。 另注意: 书写复合运算符,两个运算符不能分开
a+=1; a*=a+b; a/=(a-1)*b;
五.自增与自减运算符 (重点和难点)
++i,--i 先增(减)i,再使用i
错误赋值形式: int a=1,b=2,c; (1) c=a+b=3;
(2) a+b=c; (3) a=b=3=c;
说明:
(1)赋值运算符左边必须是变量,右边可以是常量、变 量、函数调用或常量、变量、函数调用组成的表达式。
例如:x=10 达式。 y=x+10 y=func()都是合法的赋值表
(2) 赋值符号“=”不同于数学的等号,它没有相等的含 义。 例如:C语言中x=x+1是合法的(数学上不合法), 它的含义是取出变量x的值加1,再存放到变量x中。
结果为:12
七Βιβλιοθήκη Baidu 关系运算及其表达式
所谓“关系运算”实际上就是“比较运
算”,即将两个数据进行比较,判定两个数据
是否符合给定的关系。 例如:“a > b”中的“>”表示一个大于关 系运算。如果a的值是5,b的值是3,则大于关 系运算“>”的结果为“真”,即条件成立;如
果a的值是2,b的值是3,则大于关系运算“>”
运算符与表达式
三. 算术运算符与算术表达式
1、C表达式的定义
将变量、数、函数用C运算符连接起来有意 义的式子。单独的一个数、函数、变量均被看作 表达式的特殊形式。
2、C运算符
共有13类,见P.55
3、基本算术运算符
+ 加法,正值。 如: 3+6, +3 – 减法,负值。 如: 6– 4, –5 * 乘法。 / 除法。 % 求余。 如: 3*8 如: 8 / 5 如: 7 % 4 的值为3
2 .强制类型转换
编程时为了使得运算结果是用户希望的
类型,可利用强制类型转换运算符临时将一个算
术表达式转换为所需类型。 格式: (类型名) (表达式)
不改变x
Example:
int x = 10; float y; y = (float)x; (float)10
x
10
?? y 10.000000
3、若有变量参加运算,而变量的存储单元 是在执行前就被分配了,执行运算时,为了统一
类型,再计算,系统会分配临时单元存放变量的
值,原变量类型并不变。
如: int x=4; float y; char ch=‘A’;
若: y=x*3.14+ch-45.6f / ’7’ ; 先分配临时单元将x, ch, 45.6f, ’7’转换成 double型,再计算,又因为变量是float类型,先 将double类型的表达式转换成float,再赋值。
10.000000
Example:
两个整数运算的结果 还是整数,不是浮点数
int total, number; float average; … average = total / number;
total
15 2
15 / 2 7
number
?? average 7.000000
Example:
六、逗号运算符和逗号表达式
形式:表达式1,表达式2,……表达式i,
作用:用于连接表达式
如:3+5,6+8 值为14
表达式的 值为:60
计算过程:
1、求解表达式1
如:假定a=3
(a=3*5,a*4)
2、再求解表达式2……表达式i
一个逗号表达式又可与另一个表达式组成一个新的表达式 3、整个表达式的值是表达式i的值 逗号运算符是所有运算符中级别最低的
i++,i--
先使用i,再增(减)1
j = i; j = i++; i++; i++; j = ++i; j = i;
前缀( Prefix )增一和减一运算符
Example:
j = ++i - 2
similar to
i
5 6 ?? 4
i = i + 1;
j = i – 2;
j
后缀(Postfix)增一和减一运算符
(因为“>”运算符是自左至右的结合方向,先 执行“a>b”,得值为1,再执行关系运算:“1 >c”得值0,赋给f。 说明:数值量比较:数字的大小 字符量比较:ASCII码的大小
3. 运算优先级( P92)
算术运算符 高 关系运算符 赋值运算符 低 [例] 设a=2, b=3, c=4 则: c > a+b a=b==c f = a<b<c 'a' + 5 < 'b' 0 即:c > (a+b),结果为: 即: (b = = c) , a= 0 ? 即: a<b , 1 < c ,结果为: 1 即: 97+5 < 'b' ,结果为: 0
均为双目运算符
说明:
(1)关于除法运算/ C语言规定:两个整数相除,其商为整数,小数点和小数 部分被舍弃。例如,5 / 2 = 2。-5/2=-2 (2)关于求余数运算% 符号由被除数决定 要求两侧的操作数均为整型数据,否则出错。 例 5%2 = 1 如:7%4值为3、-7%4、-7%-4、7%-4为-3,-3,3 -5%2 = -1 1%10 = 1 (3)如果参加+,-,*,/运算的两个数中有一个实数,则 5%1 = 0 结果是double型。 5.5%2 () 例 5/2 = 2 -5/2.0 = -2.5 =
= (数学上的等号) 功能:将一个表达式的值赋给一个变量。
正确赋值形式: (1) x=(y=12)/4 y值为12,x值为3,表达式的值为3 (2) x=y=12/4 y值为3,x值为3,表达式的值为3 (3) x=(y=12/4) (y值为3,x值为3,表达式的值为3 (4) b=c=a=a+b+c
(3) 对于括号内的自增运算,又要先使用i, 再使i增加1。
运算结果: i的值为3,j的值为-2。
习题:输出结果和变量a的值?
int a=3; printf("%d",-a++);
等价于 a
3 4
printf("%d",-a);
a = a + 1;
说明:(1)单目运算符,使变量的值增1或减1。 只能用于变量,而不能用于常量和表达式; 例如:6++,(a+b)++,(-i)++都不合 法。
高
double
float
数据的优先级取决
long 于该类型数据的宽度, 数据宽度大的,级别就 unsigned
高。 例2 int i; float f; double d; long l;
10+„a‟ +i*f - d/l int double double
低
例1
int
char,short
char ch; int i; float f; double d;
算术表达式 用算术运算符和括符将操作数连接起来的式子。 结合性是指同级运算时运算符的结合方向。 优先级: (#代表某一运算符) 如 a#b#c ( ) * / % + 若先运算a#b,再将其结果与c运算, 结合性 称为左结合性;从左至右运算规则 若先运算b#c,再将a与其结果运算, 自左向右,与数学上一致。 则称右结合性。从右至左运算规则
C语言的赋值符号“=”除了表示一个赋值操作外,还 是一个运算符,也就是说赋值运算符完成赋值操作后,整 个赋值表达式还会产生一个所赋的值,这个值还可以利用。
3.简写的复合赋值
Operation += -= *= Examples of expression num += 5; num -= 5; num *= 5; Description num = num + 5; num = num – 5; num = num * 5;
注意:
C语言算术表达式的书写形式与数学表达式的书写形式 有一定的区别:
(1) C语言算术表达式的乘号(*)不能省略。例如:数 学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。 (2) C语言表达式中只能出现字符集允许的字符。例如, 数学π r2相应的C表达式应该写成:PI*r*r。(其中PI是已 经定义的符号常量) (3)C表达式中的内容必须书写在同一行,不允许有分子 分母形式,必要时要利用圆括号保证运算的顺序。
Example:
j = i++ - 2
similar to
i
5 6 ?? 3
j = i – 2;
i = i + 1;
j
自右向左 结合性: 例: 分析: (1)++、--、+(正号)、-(取负)是同级 运算符,结合方向:自右向左。 (2) -i++等价于-(i++) i = 2; j = -i++;
例如:数学式
(4) C语言算术表达式只使用圆括号改变运算的优先顺序 (不要指望用{}[])。可以使用多层圆括号,此时左右括 号必须配对,运算时从内层括号开始,由内向外依次计算 表达式的值。
a+b c+d
相应的C表达式应写成:(a+b)/(c+d)。
四、赋值运算符和赋值表达式
1、赋值运算符 2、赋值表达式 用赋值运算符将变量和表达式连接 起来的式子 形式: <变量>=<表达式> 求值规则: 将“=”右边表达式的值赋 给左边的变量。 结合性:自右至左
(2)自右向左结合,。
(3)常用于循环语句中控制循环次数 ( 4 ) 单独使用时 ++i;
等 价
i++;
等 价
i=i+1;
良好的程序设计风格提倡:在一行语句中, 一个变量只能出现一次增1或者减1运算。过多
的增1和减1运算混合,不仅可读性差,而且因
为编译器实现的方法不同,导致不同编译器产 生不同的运行结果。
ch/i
int
int
+
f*d - (f+i)
double double
double double
int
double double
double
double
double
double
自动转换原则
1、 低级别的数可存入高级别的变量中, 反之不行。因为高级别变量的存储容量大。 2、当不同类型的数据混合运算时,系统先 看哪个数据的类型最高,然后将其他数据均 转换成这个类型,再进行计算。
4、各类数值型数据间的混合运算
一. 在C语言中,整型、实型和字符型数据间可以混合 运算(因为字符数据与整型数据可以通用)。 如果一个运算符两侧的操作数的数据类型不同,则系统 按“先转换、后运算”的原则,转换的方法有两种:自动转 换(隐式转换);强制转换。 1、自动转换(隐式转换) 自动转换发生在不同类型数据进行混合运算时,由编译 系统自动完成。转换规则:(参看下页图示) (1) 类型不同,先转换为同一类型,然后进行运算。 (2)图中纵向的箭头表示当运算对象为不同类型时转 换的方向。可以看到箭头由低级别数据类型指向高级别数据 类型,即数据总是由低级别向高级别转换。即按数据长度增 加的方向进行,保证精度不降低。
例2-12: a 4 4 4 5 b 5 5 5 5 y 4 9 5 5
逗号表达式
y=a=4,b=5,a+b; y=(a=4,b=5,a+b); y=(a=4,b=5),a+b; y=a=(4,b=5),a+b;
9 9 9 10
又:int a=1,b; b=(a++,3+2,a+=1,a--);
a=2,b=3
注意:并不是任何地方出现的逗号都是逗号运算符。 如:printf(“%d,%d\n”,a,b);
【例3-13】
main() { int a=1;
没有结果,因没输出符
printf(“结果为:%d\n”,a=4*a,3*a);
}
分隔符
结果为:4
printf(“结果为:%d\n”,(a=4*a,3*a ));
int total, number; float average; … average = (float)total / number;
total
15 2
15.000000 / 2 7.500000
number
?? average 7.500000
说明:
1、强制类型 转换比自动类型转换级别高。 2、高级别的 数据赋值给低级别的变量,若数 据超过变量的宽度,结果有误差或出错。
的结果为“假”,即条件不成立。
注意书写两个符号的关系运算符,期 间不要间隔。
(算术、关系、逻辑、赋值、字符)
C语言没有逻辑型数据,以1代表“真”,
以“0”代表“假”。因此,关系表达式的值,
还可以参与其它种类的运算,例如算术运算、 逻辑运算等。
又例如:变量 a=3, b=2, c=1, 则下列表达式及其值是: a > b (真) b + c < a (假) f = a > b > c a > b == c (真) d= a> b (d 的值为1 (f 值为0)
/=
%=
num /= 5;
num %= 5;
num = num / 5;
num = num % 5;
复合运算符是一个运算符,但功能上,是两个运算符 功能的组合。 另注意: 书写复合运算符,两个运算符不能分开
a+=1; a*=a+b; a/=(a-1)*b;
五.自增与自减运算符 (重点和难点)
++i,--i 先增(减)i,再使用i
错误赋值形式: int a=1,b=2,c; (1) c=a+b=3;
(2) a+b=c; (3) a=b=3=c;
说明:
(1)赋值运算符左边必须是变量,右边可以是常量、变 量、函数调用或常量、变量、函数调用组成的表达式。
例如:x=10 达式。 y=x+10 y=func()都是合法的赋值表
(2) 赋值符号“=”不同于数学的等号,它没有相等的含 义。 例如:C语言中x=x+1是合法的(数学上不合法), 它的含义是取出变量x的值加1,再存放到变量x中。
结果为:12
七Βιβλιοθήκη Baidu 关系运算及其表达式
所谓“关系运算”实际上就是“比较运
算”,即将两个数据进行比较,判定两个数据
是否符合给定的关系。 例如:“a > b”中的“>”表示一个大于关 系运算。如果a的值是5,b的值是3,则大于关 系运算“>”的结果为“真”,即条件成立;如
果a的值是2,b的值是3,则大于关系运算“>”
运算符与表达式
三. 算术运算符与算术表达式
1、C表达式的定义
将变量、数、函数用C运算符连接起来有意 义的式子。单独的一个数、函数、变量均被看作 表达式的特殊形式。
2、C运算符
共有13类,见P.55
3、基本算术运算符
+ 加法,正值。 如: 3+6, +3 – 减法,负值。 如: 6– 4, –5 * 乘法。 / 除法。 % 求余。 如: 3*8 如: 8 / 5 如: 7 % 4 的值为3
2 .强制类型转换
编程时为了使得运算结果是用户希望的
类型,可利用强制类型转换运算符临时将一个算
术表达式转换为所需类型。 格式: (类型名) (表达式)
不改变x
Example:
int x = 10; float y; y = (float)x; (float)10
x
10
?? y 10.000000
3、若有变量参加运算,而变量的存储单元 是在执行前就被分配了,执行运算时,为了统一
类型,再计算,系统会分配临时单元存放变量的
值,原变量类型并不变。
如: int x=4; float y; char ch=‘A’;
若: y=x*3.14+ch-45.6f / ’7’ ; 先分配临时单元将x, ch, 45.6f, ’7’转换成 double型,再计算,又因为变量是float类型,先 将double类型的表达式转换成float,再赋值。
10.000000
Example:
两个整数运算的结果 还是整数,不是浮点数
int total, number; float average; … average = total / number;
total
15 2
15 / 2 7
number
?? average 7.000000
Example:
六、逗号运算符和逗号表达式
形式:表达式1,表达式2,……表达式i,
作用:用于连接表达式
如:3+5,6+8 值为14
表达式的 值为:60
计算过程:
1、求解表达式1
如:假定a=3
(a=3*5,a*4)
2、再求解表达式2……表达式i
一个逗号表达式又可与另一个表达式组成一个新的表达式 3、整个表达式的值是表达式i的值 逗号运算符是所有运算符中级别最低的
i++,i--
先使用i,再增(减)1
j = i; j = i++; i++; i++; j = ++i; j = i;
前缀( Prefix )增一和减一运算符
Example:
j = ++i - 2
similar to
i
5 6 ?? 4
i = i + 1;
j = i – 2;
j
后缀(Postfix)增一和减一运算符
(因为“>”运算符是自左至右的结合方向,先 执行“a>b”,得值为1,再执行关系运算:“1 >c”得值0,赋给f。 说明:数值量比较:数字的大小 字符量比较:ASCII码的大小
3. 运算优先级( P92)
算术运算符 高 关系运算符 赋值运算符 低 [例] 设a=2, b=3, c=4 则: c > a+b a=b==c f = a<b<c 'a' + 5 < 'b' 0 即:c > (a+b),结果为: 即: (b = = c) , a= 0 ? 即: a<b , 1 < c ,结果为: 1 即: 97+5 < 'b' ,结果为: 0
均为双目运算符
说明:
(1)关于除法运算/ C语言规定:两个整数相除,其商为整数,小数点和小数 部分被舍弃。例如,5 / 2 = 2。-5/2=-2 (2)关于求余数运算% 符号由被除数决定 要求两侧的操作数均为整型数据,否则出错。 例 5%2 = 1 如:7%4值为3、-7%4、-7%-4、7%-4为-3,-3,3 -5%2 = -1 1%10 = 1 (3)如果参加+,-,*,/运算的两个数中有一个实数,则 5%1 = 0 结果是double型。 5.5%2 () 例 5/2 = 2 -5/2.0 = -2.5 =
= (数学上的等号) 功能:将一个表达式的值赋给一个变量。
正确赋值形式: (1) x=(y=12)/4 y值为12,x值为3,表达式的值为3 (2) x=y=12/4 y值为3,x值为3,表达式的值为3 (3) x=(y=12/4) (y值为3,x值为3,表达式的值为3 (4) b=c=a=a+b+c
(3) 对于括号内的自增运算,又要先使用i, 再使i增加1。
运算结果: i的值为3,j的值为-2。
习题:输出结果和变量a的值?
int a=3; printf("%d",-a++);
等价于 a
3 4
printf("%d",-a);
a = a + 1;
说明:(1)单目运算符,使变量的值增1或减1。 只能用于变量,而不能用于常量和表达式; 例如:6++,(a+b)++,(-i)++都不合 法。
高
double
float
数据的优先级取决
long 于该类型数据的宽度, 数据宽度大的,级别就 unsigned
高。 例2 int i; float f; double d; long l;
10+„a‟ +i*f - d/l int double double
低
例1
int
char,short
char ch; int i; float f; double d;
算术表达式 用算术运算符和括符将操作数连接起来的式子。 结合性是指同级运算时运算符的结合方向。 优先级: (#代表某一运算符) 如 a#b#c ( ) * / % + 若先运算a#b,再将其结果与c运算, 结合性 称为左结合性;从左至右运算规则 若先运算b#c,再将a与其结果运算, 自左向右,与数学上一致。 则称右结合性。从右至左运算规则
C语言的赋值符号“=”除了表示一个赋值操作外,还 是一个运算符,也就是说赋值运算符完成赋值操作后,整 个赋值表达式还会产生一个所赋的值,这个值还可以利用。
3.简写的复合赋值
Operation += -= *= Examples of expression num += 5; num -= 5; num *= 5; Description num = num + 5; num = num – 5; num = num * 5;