• 运算符与表达式


    1. 运算符
    什么是运算符?
    用来进行某种运算的符号。

    如: + - * / %

    a、几目运算符 : 该运算符带有几个操作数
    单目运算符: 该运算符需要一个操作数。
    如: ++ –
    双目运算符: 该运算符需要两个操作数。
    如: + - * / %
    三目运算符: 该运算符需要三个操作数。
    如: a ? b : c

    *b、结合性 :*决定先算谁后算谁
    从左至右结合,从右至左结合

    如:
    + 结合性: 从左至右结合 a + b :
    先算表达式a的值,再算表达式b的值
    最后把 a + b

    在C语言中 a + b 和 b + a 表达的含义是不一样:

    例子:
    int i = 5 , j = 6;
    (i++) + (i + j)
    (i + j) + (i++)

    c、优先级: 在一个含有多个运算符的表达式中,先算哪个运算符
    后算哪一个运算符。

    单目运算符 > 算术运算符 > 关系运算符 > 逻辑运算符 > 条件运算符 > 赋值运算符 > 逗号运算符

    (1) 算术运算符 : 进行算术运算的运算符
    ++ – : 单目运算符
    * / % + - : 双目运算符,结合性从左至右
    % : 求余,取模。要求两个操作数都必须是整数!!
    ++ : 自增运算符 i++ ++i
    – : 自减运算符i-- --i
    ++ – 单目运算符,要求操作数必须为一个“左值”
    例子: 变量是具备左值的
    常量/表达式的值 不具备左值
    5++ ERROR
    (a+b)++ ERROR
    (a++)++ ERROR
    a++ OK

    (2) 关系运算符
    用来判断两个东西关系的运算符。
    “关系” : 数值大小关系

    	< <= > >= 
    	==  != 
    	都是属于双目运算符,结合性从左至右
    	
    	关系表达式: 用关系运算符连接起来的式子。
    	
    	关系表达式的值:
    		"关系成立"  => 1 
    		"关系不成立" => 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (3) 逻辑运算符 : 用来描述逻辑关系的运算符

    	!    逻辑非  单目运算符    “取反”
    	&&   逻辑与  双目运算符    “并且”  从左至右 
    		a  &&  b  => 结果 
    		真     真     真 
    		假     真     假 
    		真     假     假
    		假     假     假
    		
    	||   逻辑或  双目运算符    “或者”  从左至右  
    		a  ||  b  => 结果 
    		真     真     真 
    		假     真     真 
    		真     假     真
    		假     假     假
    	
    	逻辑表达式: 用逻辑运算符连接起来的式子。
    	逻辑表达式的值: 
    		逻辑真 (非0) 
    		逻辑假  0 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    :C语言中,运算符的“惰性运算”:
    (1) a && b && c
    只要a为假,后面的b,c就不需要计算啦
    只有a为真,这个时候才需要去判断b的值
    只有a和b都为真的时候,才需要去判断c的值
    (2) a || b || c
    只要a为真,就不需要判断b和c的值
    只有a为假时,才需要判断b的值
    只有a和b都为假的时候,才需要去判断c的值

    (4) 位运算符
    位运算符是指按bit位来进行的运算。
    位运算符要求操作数是整数。
    有如下:
    & 按位与
    | 按位或
    ^ 按位异或
    ~ 按位取反
    << 按位左移
    >> 按位右移
    : 除了~是单目运算符外,其他的位运算符都是双目运算符,
    结合性都是从左至右。
    位运算符操作数只能是整数(整型,字符型)
    所有位运算都需要把操作数变成bit序列,然后再按bit位来进行运算。

    ~ 按位取反 :单目运算符
    & (按位与) : “与”
    a b a&b
    1 1 1
    1 0 0
    0 1 0
    0 0 0
    &如果两个bit位操作数都为1,结果才为1,否则为0.
    结论:
    一个bit与0进行“按位与”的操作,其结果为0,
    一个bit与1进行“按位与”的操作,其结果保留其原值!
    | (按位或) :双目运算符,结合性从左至右
    a b a|b
    1 1 1
    1 0 1
    0 1 1
    0 0 0
    | 按位或,只要由一个Bit操作数为1,其结果就为1.
    结论:
    一个bit与0进行“按位或”的操作,其结果为原值,
    x | 0 => x
    一个bit与1进行“按位或”的操作,其结果为1。
    x | 1 => 1
    ^ (按位异或) :
    “异或” :求异,不同为1,相同为0
    a b a^b
    1 1 0
    1 0 1
    0 1 1
    0 0 0
    结论:
    一个bit与0进行“按位异或”的操作,其结果保留其原值,
    x ^ 0 => x
    一个bit与1进行“按位异或”的操作,其结果取反。
    x ^ 1 => ~x

    << : 按位左移: 按bit位整体往左移
    a << n : 把a按bit位整体往左移n位。
    高位左移后,直接舍弃;
    低位会空出n个bit位,直接补0.
    注意:
    对于无符号的数来说,如果左移后舍弃的高位全部都是0,那么左移n位,
    得到的结果会是在原值的基础上面 乘以2的n次幂。

    >> 按位右移 : 按Bit位整体右移
    a >> n : 把a按bit位整体往右移n位。
    低位右移后,直接舍弃,
    对于无符号的数,高位全部补0;
    对于有符号的数,高位全部补符号位。

    (5) 赋值运算符
    = :双目运算符,结合性从右至左,
    优先级排倒数第二,仅比逗号高。

    	a = x : 
    		把表达式x的值,赋值给a。
    		赋值运算符要求 左边的操作数必须为一个“左值”!!
    		例子: 
    			5 = 5; //ERROR
    			2 + 3 = 5 ; //ERROR
    			i++ = 6; //ERROR
    			i = 6 ; // OBJK  
    
    赋值表达式: 由赋值运算符连接起来的式子 
    赋值表达式的值: 
    	赋值表达式的值 就是 最后赋值给左边变量的值。
    	
    	a = b = 5  
    		=> a = (b = 5)
    		把表达式(b = 5)的值,赋值给a.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    复合赋值运算符:
    赋值运算符可以和算术运算符、位运算符 组成复合的赋值运算符。

    		+= -= *= =%=
    		
    		&= |= ~= ^= <<= >>= 
    		
    	例子: 
    		a += 5 
    			<=> a = (a + 5) 
    			
    		a += 5 + 6 
    			<=> a = (a + (5 + 6)) 
    			
    		a |= 5 
    			<=> a = a | 5  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (6) 条件运算符
    ? : 三目运算符
    expression ? a : b
    上面是一个条件表达式,
    如果表达式expression值为真,则整个表达式的结果为a;
    如果表达式expression值为假,则整个表达式的结果为b。
    注:惰性运算

    (7) 逗号运算符 :
    双目运算符,结合性从左至右,优先级是最低。
    表达式1 , 表达式2
    逗号表达式求值的顺序:
    先求表达式1的值,然后再求表达式2的值,
    最终整个逗号表达式的值就是表达式2的值!
    逗号表达式的扩展形式:
    表达式1,表达式2,…,表达式n
    求值顺序:
    先求表达式1的值,然后再求表达式2的值,…,最后再求表达式n的值,整个逗号表达式的值就是表达式n的值!

    (8) 指针运算符
    *
    & : 取地址符,单目运算符
    &对象名 : 取“对象”的地址

    		例子: 
    			int a; 
    			scanf("%d", &a); 
    
    • 1
    • 2
    • 3

    (9) 求字节运算符 sizeof
    单目运算符,求一个对象或类型所占空间的字节数。

    	sizeof(x) : 
    		=> sizeof(typeof(x))
    		x可以是某某对象(变量、常量、数组 ==)
    		x也可以是某某类型。 
    		sizeof 不要求x存在,但是要求x的类型一定是确定,
    		因为我们只需要知道x的类型,那么就能够知道x所占的
    		字节大小啦!! 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (10) 分量运算符
    求结构体中成员变量(分量)
    .
    ->
    (11) 下标运算符
    []
    int a[10];
    a[0]
    a[1]

    a[9]
    (12) 强制类型转换运算符
    (类型)
    如:
    (unsigned char)255

    2. 表达式 expression
    什么是表达式?
    表达式就是表达某个意思的式子。
    在C语言中,任意合法的表达式都会有一个值!!
    那么这个值,其实就是表达式需要表达的意思。

  • 相关阅读:
    PCIe ECAM机制
    helm使用
    13年过去了,Spring官方竟然真的支持Bean的异步初始化了!
    Linux Shell脚本一文读懂
    基于STM32设计的药品柜温湿度监测系统(华为云IOT)(184)
    读书郎通过上市聆讯:平板业务毛利率走低,2021年利润同比下滑11%
    好看的html网站维护源码
    基于粒子群算法优化支持向量回归的水质预测模型
    MySQL的故事——MySQL架构与历史
    网工内推 | 雄岸区块链集团,网安工程师,HCIE-Security、CISP优先
  • 原文地址:https://blog.csdn.net/weixin_46836491/article/details/125418591