4类型转换与运算符

举例

(int)3.14  将3.14转换成整数3

(double)3  将3转换成双精度浮点数 3.0

double(3) 将3转换成双精度浮点数 3.0

(double)(3) 将3转换成双精度浮点数 3.0

以上的转换是强制类型转换,是一种运算

注意:

如果f是float类型的变量,(int)f把f的值去掉小数点作为(int)f的值(运算结果),f仍然是float类型

 

 

类型转换

隐式类型转换

当表达式中运算符所操作的数据的类型与实际要求不符时,要进行隐式类型转换,使表达式中各数据的类型符合要求

算术表达式中隐式类型转换规则是:

  (1)表达式中如有char、short和enum类型的数据时,自动将它们转换成int类型;

  (2)把表达式中不同类型的数据转换成精度最高、占用内存最多的那个数据的类型。

在类型不冲突的赋值表达式中,自动将赋值运算符右边表达式的值的类型转换成左边变量的类型

 

强制类型转换(又称显式类型转换)

形式为:

  (<类型>)<表达式> 或 <类型>(<表达式>)

例如:

  (double)3/2 或 double(3)/2

  (double)(3/2)或 double(3/2)

 

 

运算符

运算符的优先级和结合性

主要分为: 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等

根据组成表达式的运算符的不同,表达式可以分为算术表达式、关系表达式、逻辑表达式、位运算表达式、逗号表达式和赋值表达式等。

比如:

a+b-c

  +和-的结合方向都是从左向右,称为左结合性   

a=b=1

   =的结合方向是从右向左,称为右结合性

注意:

1.通常单目、三目和双目中的赋值运算符是右结合性,其余为左结合性

2.不同优先级的运算符,运算顺序按优先级由高到低执行

3.同一优先级的运算符,运算顺序按结合性的规定执行

4.可以使用圆括号()明确运算次序,圆括号()具有最高的优先级

 

 

算术运算之一:一元算术运算

   +  正,运算结果同操作数;

   -  负,运算结果为操作数的负数;

   ++  自增运算符,操作数需左值性质;

      --  自减运算符,操作数需左值性质;

 

重点:自增、自减运算符示例

++i, --i

前缀形式:运算符在变量前面,表示对变量先自增或自减,然后再参与其它运算,运算结果具有左值性质。

i++, i—

后缀形式:运算符在变量后面,表示变量先参与其它运算,再自增或自减。

 

例子:

#include <stdio.h>

void main()

{int i=3,j=10,m,n,p,q;

 m=++i;     n=i++;

 p=--j;  q=j--;

 printf(”i=%d,m=%d,n=%d\n”,i,m,n);

 printf(”j=%d,p=%d,q=%d\n”,j,p,q);

}

 

答案:

i=5,m=4,n=4

j=8,p=9,q=9

 

注意:

  1. 不能用于常量和一般表达式。

如:

int a,b,c;

a = (b+c)++;         /* 非法!!! */

a = 34++;        /* 非法!!! */

  1. 具有右结合性

如:

int k=3,j;         

j=(--k)++;         /*j=2,k=3*/

 

 

 

算术运算之二:基本算术运算(二元)

   +  加法,运算结果为两个操作数的和;

   -  减法,运算结果为左操作数减去右操作数

       的差;

   *  乘法,运算结果为两个操作数的乘积;

       /  除法,运算结果为左操作数除以右操作数

       的商;

   %  求余,运算结果为左操作数除以右操作

       数的余数,只用于整型数据,其结果也

       是整型 ;

 

例子:

20 % 6     结果为 2

20 % -6    结果为 2

-20 % 6    结果为 -2

-20 % -6   结果为 -2

 

注意:

注意:

  1. 两个整数作/运算,其结果为商的整数部分,商的小数部分直接截去。如:7/5 =1
  2. 参与%运算的操作数必须是整数,否则出错;其结果也是整数。如:7%5 =2
  3. %运算结果的符号同左操作数。

 

赋值运算符和赋值表达式示例

(=右边的“表达式”又可以是一个赋值表达式)

例子:

a=b=5        /*a=(b=5)*/

a=b=c=1    /*a=(b=(c=1))*/

a=5+(c=6)     /*c=6,a=11*/

a=(b=4)+(c=6) /*b=4,c=6,a=10*/

a=(b=10)/2       /*b=10,a=5*/

 

注意:在进行赋值表达式运算时,如果=两边的类型不一致,但都是数值型或字符型时,系统自动地将=右边的表达式的值转换成左边变量的数据类型,然后再赋值给变量。

 

 

复合的赋值运算符

10种复合赋值运算符如下:

复合算术运算符(5个)  +=,-=,*=,/=,%=

复合位运算符(5个)  &=,^=,|=,<<=,>>=

x += 3        等价于 x=x+3

y *= x + 6     等价于 y=y*(x+6)

 

 

右结合性

a+=a-=a*a        等价于a=a+(a=(a-a*a) )      

 

复合赋值运算符举例

void main()

{ int a=3,b=9,c=-7;

  a+=b;

  c+=b;

  b+=(a+c);

  printf("a=%d,b=%d,c=%d\n",a,b,c);

  a+=b=c;

  printf("a=%d,b=%d,c=%d\n",a,b,c);

  a+=a-=a*a;

  printf("a=%d\n",a);

}

 

答案:

a=12,b=23,c=2

a=14,b=2,c=2

a=-364

posted @ 2018-01-09 16:29  gd_沐辰  阅读(295)  评论(0编辑  收藏  举报