oc温习二:基本运算及基本运算符

C语言一共有34种运算符,如下:

运算符分类:

1.按照功能划分:

(1)算术运算符

  • + 加法运算符
  • - 减法运算符 或者负值运算符
  • * 乘法运算符
  • / 除法运算符
  • % 模运算符,或者取余运算符,要求%两侧均为整形

(2)关系运算符

  • < 小于运算符
  • <= 小于等于运算符
  • > 大于运算符
  • >= 大于等于运算符
  • == 等于运算符
  • != 不等于运算符

(关系运算的结果成立就为“真”==1, 不成立则为“假”==0)

 

(3)逻辑运算符

  • && 逻辑与运算符
  • ||    逻辑或运算符
  • !  逻辑非运算符

(&按位与 如果两个相应的二进制都为1, 则该位的结果值为1, 否则位0;

    | 按位或者两个相应的二进制位 只要有一个为1, 该位的结果值为1;

    ^ 按位 异或 若参加运算的两个二进制位值相同 则为0, 否则为1;

    ~ 取反 是一元运算符, 用来对一个二进制数按位取反,即将0变为1,将1 变为 0;

    << 左移用来将一个数的各二进制位全部左移N位,右补0;

    >> 右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0)

 

基本运算

(1)运算符根据参与运算的操作数的个数,分为:

  • 单目运算:只有一个操作数, 如:i++;
  • 双目运算:有两个操作数,  如a+b;
  • 三目运算:也成问号表达式, 如 a > b ? 1 : 0;

(2)优先级:oc中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的 结合性所规定的结合方向处理。(注:只需要记住( )优先级最高即可)

 

(3)c语言中,各种运算符的结合性分为两种,左结合性(自左向右)和右结合性(自右向左)

  • 自左向右,即先左后右:例如表达式:x-y+z, 则y应与“-”号结合,执行x-y 运算,然后再执行+z 运算;
  • 自右向左:最典型的右结合性运算符是负值运算符,例如:x=y=z, 由于“=” 的右结合性,应先执行 y=z 再执行 x= (y=z) 运算。

oc温习二:基本运算及基本运算符

* 整数除于整数,求出来的结果依然是整数

* 浮点型赋值给整型会损失小数部分

* %两侧必须都为整数

* 利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则反

 

(4)算术运算的注意点

  • 自动类型转换, 例如:int b = 10.5 + 1.7;
  • 自动将大类型转换为了小类型,会丢失精度 自动类型提升, 例如:int b = 10.5 + 10;
  • 将右边的1提升为了double类型,例如:double b = 1.0 / 2;(解决除法的精度问题);
  • 强制类型转换, 例如:double a = (double)1 / 2;  其中,错误写法:double b = (double)(1 / 2)
  • 求余运算注意事项:参与运算的必须是整数,错误写法:12.3 % 3;m%n 求余,相当于m/n 获取余数;运算结果的正负性取决于第一个运算数,跟后面的运算数无关,例如:10 % -3 = 1

(5)赋值运算符

  • 赋值运算符
    • 简单赋值运算符: =;
    • 复合赋值运算符: +=、-=、*=、/=、%=
      • /= 除后赋值 变量/=表达式 如:a/=3;即a=a/3

        *= 乘后赋值 变量*=表达式 如:a*=3;即a=a*3

        %= 取模后赋值 变量%=表达式 如:a%=3;即a=a%3

        += 加后赋值 变量+=表达式 如:a+=3;即a=a+3

        -= 减后赋值 变量-=表达式 如:a-=3;即a=a-3

  • 赋值表达式
    • 将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来的、有意义的式子称为表达式。
    • 等号=左边只能是变量,不能是常量,下面的写法是错误的:10 = 10 + 5;

(6)自增运算符

    在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作?供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符

    在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作?供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。

int b;

int a = 10;

b = ++a;//如果++在前代表先自增再参与其它运算

//    a = a + 1;  b = a;

//    a = 11  b = 11

    后缀表达式:x++, x--;先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

int b;

int a = 10;

b = a++;//如果++在后代表先参与其它运算再自增

//    b = a; a = a + 1;

//    a = 11  b = 10

 

 自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++, const int N=0; N++; 等都是错误 的。 而i+++j++、++i+(++j)、++a+b++、++array[--j]等,这些都是合法的

(7)逗号运算符
  • 基本概念用法: 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
一般形式形式:表达式1,表达式2,… …,表达式n;

例如:a=a+1,b=3*4;
  •  求值过程:表达式1,表达式2,… …,表达式n -----先算表达式1,再算表达式2,依次算到表达式n; 其中 整个逗号表达式的值是最后一个表达式的值
b = (a=4, ++a, a * 7);

// 1.先执行第一个表达式, 将4赋值给a

// 2.再执行第二个表达式, 让a自增变为5

// 3.再执行第三个表达式, 5 * 7

// 4.最后将最后一个表达式的值作为"逗号表达式的值"返回赋值给b, 所以b等于35
  •  逗号运算符使用注意:

  程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表表达式的值。

 

(8)sizeof的运算符

  • sizeof的运算符的介绍:sizeof的可以用来计算一个变量或一个常量,一种数据类型所占的内存字节数
  •   格式:用法:sizeof的(常量/变量)
  •   注意:sizeof的不是一个函数,是一个运算符。(面试题)

(9)关系运算符

  • oc温习二:基本运算及基本运算符
  • 关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。
  • 关系运算符都是双目运算符,其结合性均为左结合
例如4>3>2:先算4>3,条件成立,结果为1。再与2比较,即1>2,条件不成立,结果为0。
因此4>3>2的结果为0。
  •  关系运算符优先级:关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
例如2==3>1:先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。
因
此2==3>1的结果为0。
  •  关系运算符的优先级小于算术运算符
例如3+4>8-2:先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,
结果为1。因此3+4>8-2的结果为1。

 

(10)类型转换问题:

  • 类型转换分为:隐式数据类型转换和显示数据类型转换
  • 自动转换(隐式转化):
    (1)自动转换遵循以下规则:
    
    *相同数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类
    型。系统会自动对占用内存较少的类型做一个“自动类型提升”的操作
    
    *若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
    
    *转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转 成long型后再进行运算。
    
    *所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
    
    *char型和short型参与运算时,必须先转换成int型。
    
    *在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分 按四舍五入向前舍入。
  • 强制类型转换(显示转换):
  •   强制类型转换是通过类型转换运算来实现的
    其一般形式为:(类型说明符) (表达式)
    强制类型转换注意点:
    (1)将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容 易丢失精度 (2)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则了把x转换成int型之后再与y相加了。 (3)无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。

     参考文章:http://www.jianshu.com/p/141e6af7395e