1、运算符

除了赋值运算和自增自减运算之外,任何表达式都不会影响原操作数的值。

单目运算: 操作数只有一个
双目运算: 操作数有两个
三目运算: 操作数有三个

在同一个表达式中出现两个以上的运算符则成为复合运算。 在复合表达式中要分清优先级,优先级搞的要先运算。

例如:a = b + c * d

遇到同级有优先级要看结核性。

例如: a + b - c ; a = b = c

单目运算(后缀++ 和后缀--除外)、三目运算、赋值运算都是右结合性,要优先计算右操作数。

2、类型转换

C语言的类型转换分为两种,隐式转换显示转换

其中基本类型(int/short/char/float)可以自动隐式转换,复杂类型(*/struct)需要强制转换

  • 有符号数和无符号数间:编译器先讲所有的有符号数隐式转换为无符号数,结果为无符号数。

    例如:

 int a = -20;
 unsigned int b = 10;
 if(a < b)
     puts("YES");
 else
     puts("NO");

 以上结果打印:NO
  • 不同宽度的整数间:编译器会先讲所有的类型隐式转换为两者间宽度更大的类型。

    例如:

 char   short  short
 int    char   int 
 short  int    int 
  • 浮点数和整数间:编译器会先讲所有的类型转换为浮点数运算,表达式的结果为浮点数。

    例如:

 int      float     float
 char     float     float
 float    short     float
 int      doulue    double
  • 单精度和双精度浮点间:编译器会先讲所有的类型转换为双精度浮点并运算,表达式的结果为双精度浮点数。

    例如:

 float     double   double
 double    float    double

总结以上规律: 宽度不同结果向宽扩展,遇到浮点结果为浮点。

  • 布尔型和其他类型的转换:任何类型都可以隐式转换为布尔类型,此时非0为真,0为假。布尔类型可以隐式转换为整数型:真为1,假为0

3、算术运算

用来进行常规计算,包含加,减,乘,除,取模(取余),自增,自减: + - * / % ++ --

注意:

前缀++或前缀--的运算方法是先运算后取值 例如: int i = 10; ++i 表达式的结果为11

后缀++或后缀--的运算方法是先取值后运算 例如:int i = 10; i++ 表达式的结果是10,但是运算完之后变量i的值为11

4、逻辑运算

逻辑运算用来测试一个表达式结果的真假:&& || !

逻辑运算的结果是布尔值(逻辑值),只有真假两种结果。

  • 真值表:
 与:&&
     真    假    假
     真    真    真
     假    真    假
     假    假    假
 或:||
     真    真    真
     真    假    真
     假    真    真
     假    假    假
 非:!
     真    假
     假    真
  • 短路特性:在与或运算中,如果左边表达式的结果已经能够决定整个与或运算的结果时,则右边表达不再执行。

    例如:

 int a = 10;
 int b = 20;
 if(a > 0 || a += 10) //因为a > 0 为真,能够决定整个表达式的结果,a+=10不执行

 if(b <= a && b++) //因为b <= a 为假,能决定整个表达式的结果,所以b++不执行

 if(a > 5 && a++)  //因为a > 5为真,不能决定整个表达式,所以 a++ 执行

5、关系运算

用来进行数值比较:> >= < <= == !=

注意:

关系运算的结果值是布尔值(逻辑值),只有真假两种结果。
等于运算是 == ,>= <= == != 这些运算符都是两个符号,中间不能有间隔

6、位运算

用来进行位操作,可以通过运算操作数据中某一位:| ~ ^ << >>

位与:参照逻辑运算的真值表
    6    110    &
    5    101    
    --------
    4    100

位或:操作逻辑运算的真值表
    18    10010    |
    15    01111
    --------
    31    11111

异或:^相同为0, 不同为1
    1010101
    0100111
    -----------
    1110010

左移:符号位布标,整体左移,高位移出,低位补0
    1010110 <<2
      1011000     

7、赋值运算

用来改变一个变量的值,表达式的结果取最左值: += -= *= /= %= <<= >>= |= &= ^=

8、三目运算

可以用来对分支语句进行简单替代

 if(a > b)
     max = a;
 else
     max = b;
 替换为: max = a > b ? a : b;

9、逗号表达式

使用 , 符号间隔子语句,表达式的结果取最右值

例如:

 ret = (a = 10, b = 20, c = 30);
 ret 的值为30,注意上述表达式的优先级,因为逗号比赋值的优先级低,要用括号括起来。

10、其他符号

[] -> . & *

results matching ""

    No results matching ""