运算符,表达式和语句

发布于:2022-11-15 ⋅ 阅读:(482) ⋅ 点赞:(0)

运算符

赋值运算符:=

  =号左侧是一个变量名,右侧是赋给该变量的值。符号=被称为赋值运算符。

数据对象、左值、右值

  • 对象:赋值表达式语句的目的是把值储存到内存位置上。用于储存值的数据存储区域统称为数据对象。
  • 左值:是用于标识或定位存储位置的标签。赋值运算符的左侧应该是可修改的左值。当前标准建议,使用术语对象定位值更好。
  • 右值:能赋值给可修改左值的量,且本身不是左值。

加减法运算符

  • 加法运算符用于加法运算,使其两侧的值相加。相加的值(运算对象)可以是变量,也可以是常量。

  • 减法运算符用于减法运算,使其左侧的数减去右侧的数。

  • +和-运算符都被称为二元运算符,即这些运算符需要两个运算对象才能完成操作。

符号运算符

  减号还可用于标明或改变一个值的代数符号。以这种方式使用的负号被称为一元运算符。一元运算符只需要一个运算对象。

乘除法运算符

  C使用符号/来表示除法,用*来表示乘法。

  整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。而如果整数相除得到一个浮点数,会使得小数部分丢失。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断。

混合类型:即浮点值除以整型值。混合整数和浮点数计算的结果是浮点数。尽管如此,一般情况下还是

要避免使用混合类型。因为计算机不能真正用浮点数除以整数,而是转化后再计算。

运算符优先级

  正如普通的算术运算那样,乘法和除法的优先级比加法和减法高,所以先执行乘法和除法。

  如果是同级运算符,它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。

  若要使加法在乘法前执行,可以加圆括号,圆括号内部按正常的规则执行。

image-20221105094656185

sizeof运算符和size_t类型

  sizeof运算符以字节为单位返回,运算对象的大小运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。

  C 语言规定,sizeof 返回 size_t 类型的值。这是一个无符号整数类型,但它不是新类型。size_t是语言定义的标准类型。

  %zd 转换说明用于 printf()显示 size_t 类型的值。如果系统不支持%zd,可使用%u或%lu代替%zd。

求模运算符:%

  求模运算符给出其左侧整数除以右侧整数的余数。求模运算符只能用于整数,不能用于浮点数。

复数求模

  如果第1个运算对象是负数,那么求模的结果为负数;如果第1个运算对象是正数,那么求模的结果也是正数。

11 % -2得1         -11 % -5得-1

递增运算符

  递增运算符执行简单的任务,将其运算对象递增1。

形式

  • ++出现在其作用的变量前面,这是前缀模式;使用值前进行递增。

    a_post = a++; // 后缀:使用a的值乊后,递增a

  • 第2种方式,++出现在其作用的变量后面,这是后缀模式。使用值后在进行递增。

    b_pre= ++b; // 前缀:使用b的值乊前,递增b

优点

  • 紧凑结构的代码让程序更为简洁,可读性更高。这些运算符让程序看起来很美观。
  • 通常它生成的机器语言代码效率更高,因为它和实际的机器语言指令很相似。

递减运算符

  每种形式的递增运算符都有一个递减运算符与之对应,用–代替++即可。

优先级

  递增运算符和递减运算符都有很高的结合优先级,只有圆括号的优先级比它们高。

注意事项

  在C语言中,编译器可以自行选择先对函数中的哪个参数求值。这样做提高了编译器的效率,但是如果在函数的参数中使用了递增运算符,就会有一些问题。

  • 前缀后缀的使用在有些地方结果不同。

  • 如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符。

  • 如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。

  • 后面两种情况会导致不同计算结果,可能会先都递增一次再使用,如:

    n = 3;

    y = n++ + n++;

    n的值执行完程序后比原来大2,但y不能确定,要看程序执行顺序,如先不递增即3+3=6,算完后再递增n。

表达式和语句

表达式

  表达式由运算符和运算对象组成(之前的文章介绍过运算对象,运算对象是运算符操作的对象,运算对象可以是常量、变量或二者的组合。)。

子表达式

  子表达式即较小的表达式,如c/d是中a*(b + c/d)的子表达式。

完整表达式

  所谓完整表达式,就是指这个表达式不是另一个更大表达式的子表达式。

语句

  语句是C程序的基本构建块。一条语句相当于一条完整的计算机指令。在C中,大部分语句都以分号结尾。

  C把末尾加上一个分号的表达式都看作是一条语句,最简单的语句就是空语句即只有一个分号。

语句和指令关系

  虽然一条语句相当于一条完整的指令,但并不是所有的指令都是语句。因为一条完整的指令不一定是一条语句。

如,x = 6 + (y = 5);这里的y=5是指令但不是一条语句。

声明注意

  声明不是表达式语句。也就是说,如果删除声明后面的分号,剩下的部分不是一个表达式,也没有值:

副作用

  副作用是对数据对象或文件的修改。从C语言的角度看,主要目的是对表达式求值。给出表达式4 + 6,C会

对其求值得10;跟赋值运算符一样,递增和递减运算符也有副作用,使用它们的主要目的就是使用其副作用。

序列点

  序列点是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。

  在 C语言中,语句中的分号标记了一个序列点。另外,任何一个完整表达式的结束也是一个序列点。

复合语句

  复合语句是用花括号括起来的一条或多条语句,复合语句也称为块。

  注,根据while语句的结构,整个复合语句被视为一条语句。

类型转换

规则

  • 当类型转换出现在表达式时,无论是unsigned还是signed的char和short都会被自动转换成int,由于都是从较小类型转换为较大类型,所以这些转换被称为升级。
  • 涉及两种类型的运算,两个值会被分别转换成两种类型的更高级别。
  • .类型的级别从高至低依次是long double、double、float、unsigned long long、long long、unsigned long、long、unsigned int、int。例外的情况是,当long 和 int 的大小相同时,unsigned int比long的级别高。
  • 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级。所谓降级,是指把一种类型转换成更低级别的类型。类型降级会导致真正的麻烦,因为较低类型可能放不下整个数字。
  • 当作为函数参数传递时,char和short被转换成int,float被转换成double。

强制类型转换

  • 在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级。所谓降级,是指把一种类型转换成更低级别的类型。类型降级会导致真正的麻烦,因为较低类型可能放不下整个数字。
  • 当作为函数参数传递时,char和short被转换成int,float被转换成double。

强制类型转换

  即在某个量的前面放置用圆括号括起来的类型名,该类型名即是希望转换成的目标类型。圆括号和它括起来的类型名构成了强制类型转换运算符。如(int)1.6会把1.6转换为1再进行运算。

本文含有隐藏内容,请 开通VIP 后查看