- 运算符及其表达式
- 算术运算符及算术表达式
- 算术运算符
- 算术表达式
- 赋值运算符及赋值表达式
- 复合的算术赋值运算符和复合的算数赋值表达式
- 自增自减运算符及含自增自减运算的表达式
- 逗号运算符及逗号表达式
- 小结
- 类型转换
- 类型的自动转换
- 赋值表达式中的类型转换
- 不同类型数据混合运算中的类型转换
- 类型的强制转换
运算符及其表达式 算术运算符及算术表达式 算术运算符
-
C语言提供了5个基本的算术运算符
-
+加法运算符
-
-减法运算符、负号运算符
-
*乘法运算符
-
/除法运算符
-
%取余运算符(模运算符)
算术运算符是双目运算,即必须有两个运算对象才可以运算。
+、-、* 运算规则和数学意义上是一样的,%和/运算与数学意义上的模运算和除法运算有一定的区别。
两个整型数据相除的结果是整型数据。
模运算的两个运算对象要求必须是整型数据;若有一个运算对象为负数,运算结果的符号和被除数相同。
除了%运算以外的其它算术运算的两个运算对象中有一个是float型的,则运算结果是double型的。
运算符+、-的优先级相同,* 、/、%的优先级相同且高于+、-运算符,算术运算符都是左结合的运算符。
"-"作为负号运算符时是右结合性的。
用算术运算符和括号()运算符将运算对象连接起来的符合运算符对运算对象的要求的式子。
任何能够表示“确定的值”的内容,如常量、变量、数组元素、有值函数等,都可以作为运算对象。
算术表达式的运算遵循运算符优先级和结合性的原则。
表达式运算的具体过程是:对表达式自左向右扫描运算对象,然后考察运算对象两侧的运算符,如果运算对象两侧的运算符优先级不同,则该运算对象和高优先级的运算符结合;如果运算对象两侧的运算符优先级相同,则按照运算符的结合性原则去结合,如果运算符是左结合的,则和左侧的运算符结合,如果是右结合的,则和右侧的运算符结合。
当某运算符所需的运算对象全部都和该运算符结合后进行运算,运算后的中间结果就是下一个被扫描到的运算对象,当某运算符所需的运算对象没有全部结合则继续扫描下一个运算对象。
C语言的赋值运算符是“=”,是双目运算符,优先级仅高于逗号运算符,是右结合性的。
由赋值运算符构成的赋值表达式为:
变量 = 确定的值
赋值表达式会得到两个值。
一个是赋值运算符左侧变量的值;另一个是赋值表达式本身的值,赋值表达式的值与变量的值是相同的。
在C语言中赋值表达式是有值表达式,这一点和其它的高级语言是不同的。
既然赋值表达式是有值表达式,那么赋值表达式就可以作为一个运算对象参与其它表达式的运算。
在赋值运算符“=”前加上其它的运算符,可以构成复合的赋值运算符。
C语言提供了5种复合的算数赋值运算符,分别是+=、-=、*=、/=、%=,是双目运算符,优先级和赋值运算符相同,也是右结合性的。
复合的算术赋值运算符构成的算数赋值表达式为:
变量 复合的算数赋值运算符 确定的值
等效于:
变量 = 变量 算术运算符 确定的值
自增自减运算符及含自增自减运算的表达式
C语言中提供了两个特殊的运算符,自增运算符++和自减运算符--。
它们都是单目运算符,运算对象可以位于运算符前面,也可以位于运算符后面。
当运算符位于运算对象前面时,称为前缀运算符;当运算符位于运算对象后面时,称为后缀运算符。
自增自减运算符实现的功能是将运算对象加1或减1后,再将结果保存到运算对象中去。
自增自减运算符的运算对象只能是变量,而不能是常量或表达式,因为常量的值是不可以发生变化的,表达式仅仅表示的是一个值,不能表示一个变化的量。
-
自增自减运算符是右结合性的,当表达式中出现自增自减运算时,表达式的运算规则如下
-
自增自减运算符是后缀运算符时,应先使用其运算对象运算整个表达式的值,然后再执行自增自减运算。
-
自增自减运算符是前缀运算符时,应先完成自增自减,然后使用运算后的结果运算整个表达式的值。
-
当表达式中既含有后缀自增自减运算符,又含有前缀自增自减运算符时,应先执行所有的前缀自增自减运算,再运算整个表达式的值,最后执行所有的后缀自增自减运算。
在C语言中逗号“,”也是一种运算符,优先级是最低的。
其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
逗号表达式的一般形式为:
表达式1, 表达式2
逗号表达式的运算过程是顺序运算表达式1、表达式2的值,并以表达式2的值作为整个逗号表达式的值。
C语言有丰富的运算符和丰富的表达式。
判断表达式类别应根据表达式中最后运算的运算符的类别来判定。
C语言规定不同类型的数据不能够直接进行运算,只有相同类型的数据才能直接运算。
但是在描述表达式时,参与运算的运算对象却可以是不同类型的数据,于是在表达式进行运算的时候存在类型的转换问题。
在C语言中有两种形式的类型转换。
类型的自动转换
赋值表达式中的类型转换
- 浮点型数据赋值给任意整型变量
舍去浮点型数据的小数部分,将整数部分赋给整型变量。不存在四舍五入。
- 任意整型数据赋值给浮点型变量
数值保持不变,只是将整型数据以浮点型数据的存储形式存储到相应的浮点变量中。 - 字符型数据赋值给任意整型变量
- 任意整型数据赋值给字符型变量
- 有、无符号基本整型数据赋值给有、无符号长整型变量
- 有、无符号长整型数据赋值给有、无符号基本整型变量
- 相同长度的整型数据赋值给相同长度的整型变量
有符号基本整型、无符号基本整型长度相同,有符号长整型、无符号长整型长度相同。转换的规则是存储形式不发生变化,但代表的真值不一定相同。
当某一运算符两侧的运算对象类型不相同时,应进行类型的转换,转换的依据是低类型转换为高类型。
类型的高低是由某类型是数据在内存中所占的字节数的多少来确定的。
字符型数据的类型是最低的,双精度浮点型的类型是最高的。
在相同字节类型的数据中,浮点类型高于整型,无符合类型高于有符号。
C语言规定在运算时char型数据必须转换为int型,float型数据必须转换为double型参与运算。
float型数据转换为double型的主要目的是为了提高运算的精度,因为double型提供的有效位数多于float型。
这种情况下的类型转换称为必然的转换。
当类型的自动转换不能达到目的时,可以使用强制类型转换的方法。
强制类型转换是通过类型转换运算来实现的。
类型转换运算符“(类型说明符)”是单目运算符,优先级最高,是右结合性的。
强制转换表达式的一般形式为:
(类型说明符) 确定的值
强制转换表达式的功能是把确定的值强制转换成类型说明符所表示类型的数据。
- 强制类型转换运算符的运算对象是表达式时应加括号,单个变量可以不加括号。
- 强制类型转换仅仅决定了强制转换后表达式的类型,不会改变强制转换运算对象的数据类型和值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)