3.运算符和表达式

  • 算术运算符:

假设变量 A 的值为 10,变量 B 的值为 20,则:
image

关于自增和自减

  • 运算符在前,先计算,表达式的值为递增后的值
  • 运算符在后,取原变量值使用,表达式的值为递增前的值
    注意:加分号(结束符)就是语句,不加就是表达式。

Exammple:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 1, j = 10, value;
    value = i++ + ++j;
    /*
    * i = 1 值不发生改变
    * j = 10 + 1 = 11
    * value = 1 + 11 = 12
    */
    printf("i = %d\n",i);
    printf("j = %d\n",j);
    printf("value = %d\n",value);
    
    exit(0);
}

输出:

i = 2
j = 11
value = 12
  • 关系运算符

假设变量 A 的值为 10,变量 B 的值为 20,则:
image

区别赋值运算符=与关系运算符==,后者返回逻辑值1 or 0

  • 逻辑运算符

假设变量 A 的值为 1,变量 B 的值为 0,则:
image

注意:逻辑运算符(&&,||)的短路特性

  • 1、对于逻辑与&&来说,当第一个条件已经为假时,则表达式结果一定为假(同真为真,一假则假 ),此时不再执行第二个条件。例如:a && b 当a条件为假的时候,则b条件被短路,不再执行b条件,直接返回假。
  • 2、对于逻辑或||来说,当第一个条件已经为真时,则表达式结果一定为真(一真则真,同假则假 ),此时不再执行第二个条件。例如:a || b 当a条件为真的时候,则b条件被短路,不再执行b条件,直接返回真。
  • 位运算符(对嵌入式开发有重要意义

针对嵌入式应用中:用于硬件的控制,直接针对某一位来处理,处理缓冲区等。

位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
image

假设变量 A 的值为 60,二进制为0011 1100,变量 B 的值为 13,二进制为0000 1101,则:
image

  • 二进制左移运算符<<,右补0,左边被挤下的二进制位丢弃
  • 二进制右移运算符>>,正数左补0,负数左补1,右边被挤下的二进制位丢弃
int i = B1100  // B 表示二进制,十进制数值为12
//左移1位 i << 1   1100 --> 1000 ->  --> 8
//右移1位 i >> 1   1100 --> 0110 -> 0110 --> 6
  • 异或运算符^:相同为0,不同为1.
  • 赋值运算符

image

Example:

int a = 10;
a -= a *= a += a /= 2
//计算时从右往左计算
// a /= 2 --> a = a / 2 = 10 / 2 = 5;
// a += 5 --> a = a + 5 = 5 + 2 = 7;
// a *= 7 --> a = a * 7 = 7 * 7 = 49;
// a -= 49 --> a = a - 49 = 49 - 49 = 0;
  • 杂项运算符

image

三目运算符:如a > b ? a : b

等同于if语句中的

if(a > b)
   return a;
else
   return b;
  • 运算符之间的优先级

运算符的优先级确定表达式中项的组合,下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
image

  • 位运算的特殊意义
  • 将操作数中第n位(从0开始,num从右 --> 左数)置1,其他位置不变:

做按位或运算:num = num | 1 << n ,将原来二进制数与1向左移n个位做按位或运算。

  • 将操作数中第n位(从0开始,num从右 --> 左数)清0,其他位置不变:

num = num & ~(1 << n)

  • 测试第n位:if(num & 1 << n)
  • 如何从指定宽度的书中取出其中的某几位???
posted @ 2023-06-29 17:04  假行僧me  阅读(5)  评论(0编辑  收藏  举报