vlambda博客
学习文章列表

C语言表达式和运算符

「今天是学习C语言第 13 天」


当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch

# 1.基本概念

C语言提供多种运算符,可以对各种变量和常量进行运算。

表达式是运算符、变量、常量的组合,表达式可以求值。


表达式中会出现多种运算符,计算顺序由运算符的优先级决定,同级的运算符计算顺序由结合性决定。

圆括号 () 可以显式改变计算顺序,括号内表达式被优先计算。

C语言规定运算符优先级从高到低计算,结合性从左到右、从右到左。


一元运算符:需要一个操作数运算;二元运算符:需要两个操作数运算;三元运算符:需要三个操作数运算。

注:表达式和运算符分类基本对应,下面按照优先级依次学习。


# 初等表达式:基本的表达式

  •     变量或函数标识符

  •     常量

  •     字符串字面值


    例如 int y = x + 10;  

    其中x是变量标识符,是初等表达式,值为变量x当前的值;

    10是整数常量,也是表达式,值为10;

    "abcd" 字符串也是初等表达式,值为指向char类型的指针;

    

# 括号表达式:不改变表达式的值

    (表达式)

    对任意的表达式加(),不改变()内表达式的值,仅改变复合表达式中计算顺序。


# 后缀表达式 6种:

  •     数组下标[]  

  •     函数调用()  

  •     结构或联合直接成员选择.  

  •     结构和联合间接成员选择->  

  •     后缀自增++ 

  •     后缀自减--


    例如 

    int a[2] ={0,1}; //  a[0]是下标表达式,值为0;

    

    int sum(int a, int b) {return a+b;};  // sum(1,2)是函数调用表达式,值为3


    struct Student {

        char *name;

        int age;

    } student;

    student.age 直接访问成员age的值

    sutdent->name 间接访问指针成员name的值


    int x,y;

    x = 10;

    y = x++;  // 相当于 y=x; x=x+1; 此时y=10,x=11

 

    x = 10;

    y = x--;  // 相当于 y=x; x=x--; 此时y=10,x=9

    

# 一元表达式 9种:

  •     前缀自增++  前缀自减--  

  •     正号运算+  负号运算- 按位取反~  逻辑非运算!

  •     类型或数据对象的大小sizeof

    

    例如

    int x,y;

    x = 10;

    y = ++x;  // 相当于 x=x+1; y=x 此时y=11,x=11

    

    x = 10;

    y = --x;  // 相当于 x=x--; y=x 此时y=9,x=9

    

    int i = 10;

    

    int x = +-10; // x=-10,正号运算不改变表达式值正负

    int x= -10;  // x=-10,负数

    

    x = 10;

    y = ~x;     // 10转为32位二进制表示 00000000 00000000 00000000 00001010,按位取反变成11111111 11111111 11111111 11110101,y=-11

    

    x = 10;

    y = !x;     // 0表示假,非0表示逻辑真,x非零为真,取非后为假,y=0

    

    sizeof(int) // 对整型int求长度,一般为4个字节

    sizeof(x)   // 对变量x求长度,x为int型,值为4个字节

    

# 强制类型转换:对表达式的值类型进行强制转换

    (类型)表达式

    

    (float)3.1415926  // double类型转换为float

    (int)3.1415926f   // float类型转换为int

    (unsigned)100000000  // int类型转换成无符号int

    

# 二元表达式 8种:

    乘除求余表达式:乘法*  除法/  求余%

    注:乘除支持所有整数和小数类型,求余运算只支持整数。除法和求余的除数不能是0。

    加减表达式:加法+ 减法-


    移位表达式:左移<<  右移>>  

    注:有符号类型且值为负右移结果,由编译器实现定义处理符号位。

    关系表达式:小于< 小于等于<= 大于>  大于等于>=

    判等表达式:等于==  不等于!=

 

    按位与表达式:&  

    两个操作数对应的二进制位置位1时,表达式值对应的位才能为1,否则为0

    

    按位异或表达式:^ 

    两个操作数对应的二进制位取值不同时,表达式值对应的位才能为1,否则为0

    

    按位或表达式:|

    两个操作数对应的二进制位有任意1位为0时,表达式值对应的位就能为1,否则为0

   

    int x=2,y=9;

    x*y = 18

    y/2 = 4  // 整数运算,默认是值是int型,取整

    y%x = 1  // 不能整除,余数是1

    x+y = 11

    x-y = -7

    

    x << 2  // x的值按位向左移动2位,空出的二进制填充0,x = 8

    x >> 2  // x按位向右移动2位,空出的二进制填充0,x = 0

    

    x > y   // 结果为假,值0

    x >= y  // 结果为假,值0

    x < y   // 结果为真,值1

    x <= y  // 结果为真,值1

    x == y  // 结果为假,值0

    x != y  // 结果为真,值1

    

    x & y  // x二进制表示 0010,y二进制表示 1001,按位与结果是 0000

    x ^ y  // 结果1111

    x | y  // 结果1011


# 逻辑表达式 2种

    逻辑与表达式:&&

    两个条件都为真时,表达式值才为真,否则为假。

    

    逻辑或表达式:||

    两个条件有一个为真时,表达式值就为真,两个条件都为假时,表达式值才为假。

    

    1表示真,0表示假

    1 && 0   值 0

    1 && 1   值 1

    1 || 0   值 1

    0 || 0   值0

    

    短路原则:如果第一个条件已经判断最终结果真假,第二个条件不计算。

    

# 三元表达式 1种

    条件运算符 ?:

    语法:逻辑或表达式?表达式1:表达式2

    当逻辑或表达式结果为真时,返回表达式1的值,否则表达式2的值

    

    int x=1,y=2;

    x > y ? x:y   // x和y谁大返回谁的值,这里返回y的值

    

# 赋值表达式 5种

    简单赋值:=

    复合赋值: 

        乘除求余复合赋值 *= /= %= 

        加减复合赋值 += -= 

        位移复合赋值 左移<<=  右移>>= 

        位运算复合赋值  与&=  异或^= |=或

        

        x = 1,y=2;

        

        x *= y  // x=x*y

        x /= y  // x=x/y

        x %= y  // x=x%y

        

        x += y  // x=x+y

        x -= y  // x=x-y

        

        x <<= 2  // x=x<<2

        x >>= 2  // x=x>>2

        

        x &= y   // x=x&y

        x ^= y   // x=x^y

        x |= y   // x=x|y

        

# 逗号表达式 

    逗号运算符 ,

    多个表达式用逗号分割,从左到右按顺序计算。

    逗号表达式运算的结果是最后一个表达式的值。

    

    例如:

    x1,y1,x,y  // 最后值为y的值


# 常量表达式

- 常量表达式的值在编译时就可以由编译器直接计算得出,不需要程序执行时计算。

- 常量表达式不应包含赋值、增量、减量、函数调用或逗号运算符。

- 特例:sizeof运算符操作数可以出现上述情况,sizeof只需要根据类型推断大小,不需要对操作数求值。


三类:

预处理器常量表达式:预处理指令中使用的整数常量表达式

整数常量表达式:整数常量、枚举常量、字符常量、sizeof表达式、浮点常数强制转换


---------- End ----------


往期精彩推荐:






「喜欢C请赏个 赞    点击右下角 在看」