【学习笔记之我要C】详解操作符

简介: 【学习笔记之我要C】详解操作符

1、算术操作符

            +   -   *   /   %

  对于/来说,如果想有得到一个小数,除数与被除数之间至少都有一个浮点数类型;

  取模操作符%左右两端必须都是整数。

int main() {
  double a = 6 / 5;   //1.000000
  double b = 6.0 / 5.0;   //1.200000
  printf("a:%lf\nb:%lf", a, b);
  int c = 7 % 3;
  printf("%d", c);
  return 0;
}

2、移位操作符

              <<            >>

 <<左移操作符:左边丢弃,右边补0;

 >>右移操作符:

  1.算术右移:右边丢弃,左边补原符号位;

  2.逻辑右移:右边丢弃,左边补0;

 对于移位运算符,不能移动负数位,这个是标准未定义的。

int main() {
  int a = 2;
  int b = a << 1;
  printf("%d", b);
  return 0;
}
int main() {
  int a = 10;
  int b = a >> 1;
  printf("%d", b);
  return 0;
}
int main() {
  int a = -1;
  int b = a >> 1;
  printf("%d", b);
  return 0;
}

3、位操作符

        &         |         ^

 &按位与:按(2进制)位与,二进制位有0为0,全1为1;

 |按位或:按(2进制)位或,二进制位有1为1,全0为0;

 ^按位异或:按(2进制)位异或,对应的二进制位进行异或,相同为0,不同为1。


int main() {
  int a = 3;//00000000 00000000 00000000 00000000 00000011
  int b = 5;//00000000 00000000 00000000 00000000 00000101
  //&按位与,有0为0,全1为1;
  //00000000 00000000 00000000 00000000 00000001
  int c = a & b;//1
  printf("%d\n", c);
  //|按位或,有1为1,全0为0;
  //00000000 00000000 00000000 00000000 00000111
  int d = a | b;//7
  printf("%d\n", d);
  //^按位异或,相同为0,不同为1。
  //00000000 00000000 00000000 00000000 00000110
  int e = a ^ b;//6
  printf("%d\n", e);
  return 0;
}

4、单目操作符

    !  -  +  &  sieof()  ~  --  ++  *  (类型)

  sizeof()括号中的表达式不参与运算;

  单目操作符只有一个操作数。

int main() {
  int a = 10;
  printf("%p\n", &a);//&  - 取地址操作符
  int* pa = &a;//pa用来存放地址 - pa就是一个指针变量
  *pa = 20;//*  - 解引用操作符  - 间接访问操作符
  printf("%d\n", a);//20
  return 0;
}

5、逻辑操作符

                    &&  ||

  &&逻辑与,有假为假,全真为真;当&&遇上假时,便不会再往下执行,直接返回假;

  ||逻辑或,有真为真,全假为假;当||遇上真时,便不会再往下执行,直接返回真。

6、条件操作符(三目操作符)

  epx1 ? epx2 : exp3

  如果epx1为真则返回epx2,为假则返回epx3

7、下标引用、函数调用和结构成员

          []  ()  .  ->

  []下标引用操作符,两个操作数:一个数组名,一个索引值;

  ()函数调用操作符,任何函数调用都必须用函数调用操作符;

  .->结构成员访问操作符。

//创建一个学生类型
struct student {
  //成员变量
  char name[20];
  int age;
  double score;
};
//创建一个书的类型
struct book {
  char name[20];
  float price;
  char id[30];
};
int main() {
  //结构体的创建和初始化
  struct student s = { "张三", 20, 85.5 };
  //结构体变量.成员变量
  printf("1:%s %d %lf\n", s.name, s.age, s.score);
  struct student* ps = &s;
  printf("2: %s %d %lf\n", (*ps).name, (*ps).age, (*ps).score);
  //结构体指针->成员变量名
  printf("3: %s %d %lf\n", ps->name, ps->age, ps->score);
  return 0;
}

8、部分操作符的应用

//不新建第3个变量的情况下,交换a,b的值
int main() {
  int a = 3;
  int b = 5;
  printf("a:%d b:%d\n", a, b);
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
  printf("a:%d b:%d", a, b);
  return 0;
}
//求一个整数存储在内存中的二进制中1的个数
int main() {
  int a = 7;
  int b = 1;
  int i = 0;
  int ret = 0;
  for (i = 0; i < 31; i++) {
    int c = a & b;
    a = a >> 1;
    if (1 == c) {
      ret++;
    }
  }
  printf("a的二进制中有%d个1\n", ret);
  return 0;
}

有部分操作符在前面已经写过了,还有些基础性的东西前面也有写:【学习笔记之菜Dog学C】初识操作符和原码、反码、补码

目录
相关文章
|
6天前
|
编译器 C语言
操作符详解(1)
操作符详解(1)
16 0
|
13天前
|
索引
操作符,详细讲解
操作符,详细讲解
|
30天前
|
存储 程序员 C语言
操作符详解1(二)
该内容是一个关于C语言操作符和结构体的教程摘要。首先提到了加法操作符`+`的使用,并给出了一种不使用临时变量交换两个数的方法。接着讨论了如何计算整数的二进制表示中1的个数,通过位操作符实现。然后介绍了逗号表达式和函数调用操作符`()`,以及结构体成员访问操作符`.`和`-&gt;`,用于访问和修改结构体内的成员变量。文章以讲解结构体的声明、初始化和通过指针访问结构体成员为重点,展示了如何直接和间接地操作结构体数据。
22 0
|
30天前
|
编译器 C语言 C++
操作符详解2(二)
本文介绍了编程中的操作符转换和表达式解析规则。当操作数类型不同时,会进行寻常算术转换,按照long double、double、float等类型顺序进行向上转换。表达式求值时,虽然操作符有优先级,但不能决定操作数的求值顺序,例如`a*b + c*d + e+f`中乘法先于加法,但具体计算顺序不确定,可能导致不同结果。同样,如`c++ + c--`这样的表达式也是有歧义的,因为++和--的左右结合性不能确定操作数的获取顺序。文章强调,复杂的表达式可能因编译器差异产生不同结果,应避免使用可能导致非唯一计算路径的表达式以减少潜在风险。
22 0
|
1月前
|
编译器 索引
操作符详解3
操作符详解3
22 0
|
1月前
|
存储 编译器 C语言
|
11月前
|
编译器 C语言
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
82 0
【C语言初阶】带你轻松玩转所有常用操作符(3)——关系操作符,逻辑操作符,条件操作符,逗号表达式
|
SQL
NOT操作符
NOT操作符
55 0
|
SQL
LIKE操作符
LIKE操作符
64 0
|
存储 编译器 C语言
操作符详解(完)
操作符详解(完)