C语言的操作符

这篇具有很好参考价值的文章主要介绍了C语言的操作符。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

C语言中的操作符是用于操作变量、常量和表达式的符号,以下是我学习操作符整理的相关知识点。

操作符分类

算数操作符

算数操作符: + - * / %

  1. +-*/可以用于操作整数和浮点数
  2. %只能操作整数,返回整除后的余数

移位操作符

<< 左移操作符

>> 右移操作符

这两个只能用于整数

  1. << 操作符

    • // 往左移,左边丢掉,右边补0
      
      // 例子
      int a = 3;  // 3在内存中二进制 00000000 00000000 00000000 00000011
      a = a << 1;  // 往左移1位,左边的丢掉,右边的补0,结果为 00000000 00000000 00000000 00000110  
      // 此时a=6
      
  2. >>操作符

    • /*
      往右移,分两种情况
      	逻辑移位: 左边补0,右边丢掉
      	算数移位: 左边补原符号,右边丢掉
      
      这里还有一个知识点,就是负数在内存中是以补码的形式存在的
      以下是-7的原码,反码,补码
      原码: 第一位代表符号位
      	10000000 00000000 00000000 00000111
      反码: 右原码除了符号位,其他位取反
      	11111111 11111111 11111111 11111000
      补码: 由反码+1得到
      	11111111 11111111 11111111 11111001
      */
      
      // 例子
      int a = -7;  // -1在内存中二进制 11111111 11111111 11111111 11111001
      a = a >> 1;  // 往右移一位,通常是使用算数移位,补原符号,得11111111 11111111 11111111 11111100
      /*
      补码: 11111111 11111111 11111111 11111100   
      -1得到反码: 11111111 11111111 11111111 11111011
      取反得到原码: 10000000 00000000 00000000 00000100  -> 4
      此时a=4
      */
      

位操作符

位操作符: & | ^
位操作符只能操作整数

  • &按位与

    • /*
      使用两个数的二进制进行运算,只要有0就是0,全1才为1
      */
      
      #include <stdio.h>
      
      int main()
      {
      	int x = 2;  // 00000000 00000000 00000000 00000010
      	int y = 1;  // 00000000 00000000 00000000 00000001
      	printf("%d\n", x & y);  // 00000000 00000000 00000000 00000000 -> 0
      	
          int a = 15;  // 00000000 00000000 00000000 00001111
      	int b = 8;  // 00000000 00000000 00000000 00001000
      	printf("%d\n", a & b);  // 00000000 00000000 00000000 00001000 -> 8
      	return 0;
      }
      
  • |按位或

    • /*
      使用两个数的二进制进行运算,全0才为0,只要有1就为1
      */
      
      #include <stdio.h>
      
      int main()
      {
      	int x = 2;  // 00000000 00000000 00000000 00000010
      	int y = 1;  // 00000000 00000000 00000000 00000001
      	printf("%d\n", x | y); // 00000000 00000000 00000000 00000011  -> 3
          
      	int a = 15;  // 00000000 00000000 00000000 00001111
      	int b = 8;  // 00000000 00000000 00000000 00001000
      	printf("%d\n", a | b);  // 00000000 00000000 00000000 00001111 -> 15
      	return 0;
      }
      
  • ^ 按位异或

    • /*
      使用两个数的二进制进行运算,相同为0,不相同为1
      */
      
      #include <stdio.h>
      
      int main()
      {
          int x = 2;  // 00000000 00000000 00000000 00000010
          int y = 1;  // 00000000 00000000 00000000 00000001
          printf("%d\n", x ^ y);  // 00000000 00000000 00000000 00000011  ->  3
          
          int a = 15;  // 00000000 00000000 00000000 00001111
          int b = 8;  // 00000000 00000000 00000000 00001000
          printf("%d\n", a ^ b);  // 00000000 00000000 00000000 00000111  -> 7
          return 0;
      }
      
  • 练习题

    • 不能创建临时变量(第三个变量),实现两个数的交换

      #include <stdio.h>
      
      int main()
      {
          int a = 2;  // 00000000 00000000 00000000 00000010
          int b = 3;  // 00000000 00000000 00000000 00000011
          a = a ^ b;  // a -> 00000000 00000000 00000000 00000001  -> 1
          b = a ^ b;  // b -> 00000000 00000000 00000000 00000010  -> 2
          a = a ^ b;  // a -> 00000000 00000000 00000000 00000011  -> 3
          // 最后a=3,b=2,实现了交换
          return 0;
      }
      
    • 编写代码实现:求一个整数存储在内存中的二进制中1的个数。

      #include <stdio.h>
      
      int main()
      {
          int a = 15;  // 00000000 00000000 00000000 00001111
          int count = 0;
          while(a)
          {
              // 这里就只写后8位了
              // 第一轮: 00001111 & 00001110 -> 00001110  第二轮: 00001110 & 00001101 -> 00001100
              a = a & (a - 1);
              count += 1;
          }
          printf("%d\n", count);  // 4
          return 0;
      }
      

赋值操作符

可以随意操作变量的值

普通的赋值符 =

复合赋值符 +=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=

// 复合赋值符
int a = 10;
a += 10; // 跟 a = a + 10 效果一样
a <<= 10; // 跟 a = a >> 10 效果一样

单目操作符

!  		逻辑取反
-  		负值
+  		正值
&  		取地址
sizeof	操作符的类型长度(以字节为单位)
~		对一个数的二进制取反
--		前置--、后置--
++		前置++、后置++
*		间接访问操作符
(类型)   强制类型转换
  • !逻辑取反

    • // 非0取反就是0,0取反就是1
      
      #include <stdio.h>
      
      int main()
      {
      	printf("%d\n", !6);  // 0
      	printf("%d\n", !0);  // 1
      	return 0;
      }
      
  • -代表负值和+代表正值

  • &取地址

    • // 获取变量的地址
      
      #include <stdio.h>
      
      int main()
      {
      	int num = 66;
      	printf("%p\n", &num); // 这里%p是打印的是地址,输出的是num在内存中的00000048F81CF884
      	return 0;
      }
      
  • sizeof计算操作符的类型长度

    • #include <stdio.h>
      
      int main()
      {
      	int num = 10;
      	printf("%d\n", sizeof(num));  // 4 因为Int类型的字节数就是4
      	printf("%d\n", sizeof num);  // 4 因为sizeof是操作符,不是函数,所以可以这样写
      	return 0;
      }
      
      // 以下是关于sizeof的一个练习,依次输出的数字是什么
      #include <stdio.h>
      
      void test1(int arr1[])
      {
      	printf("%d\n", sizeof(arr1));  // 这里输出的是内存的字节数,64位操作系统,输出8,32位则是4
      }
      
      void test2(char arr2[])
      {
      	printf("%d\n", sizeof(arr2));  // 这里输出的是内存的字节数,64位操作系统,输出8,32位则是4
      }
      
      int main()
      {
      	int arr1[10] = { 0 };
      	char arr2[10] = { 0 };
      	printf("%d\n", sizeof(arr1));  // 这里输出的是10个int类型的字节数,40
      	printf("%d\n", sizeof(arr2));  // 这里输出的是10个char类型的字节数,10
      	test1(arr1);
      	test2(arr2);
      	return 0;
      }
      
      // 所以答案是: 40 10 8 8
      
  • ~操作符

    • // 二进制按位取反
      
      int a = 1;  
      /* 
      1 -> 00000000 00000000 00000000 00000001 
      ~取反 -> 11111111 11111111 11111111 11111110  此时是负数,存的是补码,需要求出原码
      +1获得反码 -> 11111111 11111111 11111111 11111101
      取反获得原码,符号不变 -> 10000000 00000000 00000000 00000010  -> -2
      */
      printf("%d\n", ~a);  // -2
      
  • ++--

    • // ++和-- 原理一致,以下以++为例
      
      // 前置++,就是先++,后引用
      int a = 3;
      int b = ++a;
      // 最后 a -> 4 ; b -> 4
      
      // 后置++,就是先引用,后++
      int a = 3;
      int b = a++;
      // 最后 a -> 4 ; b -> 3
      
  • *间接访问操作符

    • // 一般配合&使用
      #include <stdio.h>
      
      void test(int* num)
      {
          *num = 666;
      }
      
      int main()
      {
          int num = 0;
          // 此时需要一个函数改变num的值
          test(&num);
          printf("%d\n", num);  // 666
          return 0;
      }
      
  • (类型)可以强制类型转换

    • int a = 3.16;  // 当出现将double类型赋值给int类型的变量时,编译的时候会提示3.16是double类型的,使用a来接收的话可能会丢失数据
      int a = (int) 3.16;  // 这样就不会先出警告了
      

逻辑操作符

&& 逻辑与

|| 逻辑或

  • &&逻辑与

    • // 有0则为0,全非0为1
      
      int main()
      {
      	int a = 5;
      	int b = 0;
      	printf("%d\n", a && b);  // 0
          
      	int x = 2;
      	int y = 3;
      	printf("%d\n", x && y);  // 1
      }
      
      
  • ||逻辑或

    • // 只有有非0就为1,全0才为0
      
      int main()
      {
      	int a = 5;
      	int b = 0;
      	printf("%d\n", a || b);  // 1
      
      	int x = 0;
      	int y = 0;
      	printf("%d\n", x || y);  // 0
      }
      
  • 练习题

    • 写出程序输出的结果
      #include <stdio.h>
      
      int main()
      {
      	int i = 0, a = 0, b = 2, c = 3, d = 4;
      	c = a++ && ++b && d++;
      	printf("a = %d\t b = %d\t c = %d\t d = %d\n", a, b, c, d);
      	return 0;
      }
      
      /*
      当执行到c = a++ && ++b && d++;时,此时是a++先引用后++
      c = 0 && ++b && d++;因为0与上任何数都是0,所以后面的++b和d++不会执行
      最后输出 a = 1   b = 2   c= 0   d = 4
      */
      
      // 扩展,以下输出结果是什么
      #include <stdio.h>
      
      int main()
      {
      	int i = 0, a = 0, b = 2, c = 3, d = 4;
      	c = a++ || ++b || d++;
      	printf("a = %d\t b = %d\t c = %d\t d = %d\n", a, b, c, d);
      	return 0;
      }
      
      // 这里输出是a = 1   b = 3   c= 1   d = 4
      

条件操作符

格式: exp1 ? exp2 : exp3

当exp1成立,执行exp2,否则exp3

  • 例子

    • // 请输入一个整数,如果这个整数比10大,输出比10大,反之输出小于等于10
      #include <stdio.h>
      
      int main()
      {
      	int num = 0;
      	scanf("%d", &num);
      	num > 10 ? printf("比10大\n") : printf("小于等于10\n");  // 这里使用的就是条件操作符
      	return 0;
      }
      

逗号表达式

格式: exp1, exp2, exp3, exp4

从左往右依次执行,表达式的结果是最后一个表达式的结果

  • 例子

    • int main()
      {
      	int a = 1;
      	int b = 1;
      	int c = (a++, b += a, a += b);
      	printf("%d\n", c);  // 5
      	return 0;
      }
      
      /*
      解析:
      	先是a++,a=2
      	然后b+=a,b=3
      	最后a+=b,a=5
      	所以c=5
      */
      

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

  • 下标引用操作符[]

    • 格式: 一个数组名 + 一个索引值
      #include <stdio.h>
      
      int main()
      {
      	int arr[5] = { 0 };
      	printf("%d\n", arr[2]);  // 0
      	arr[2] = 10;  // 这里使用下标引用操作符修改了数组里的元素
      	// 2[arr] = 5; 这个其实也能生效,但是不会用,其实底层是*(2+arr) = 5;
      	printf("%d\n", arr[2]);  // 10
      	return 0;
      }
      
  • 函数调用操作符()

    • 格式: 函数名+()
      int test()
      {
          return 1;
      }
      
      int main()
      {
          int num = test();  // 函数后面的()就是函数调用操作符
          return 0;
      }
      
  • 访问一个结构的成员

    • .:结构体.成员名,->:结构指针->成员文章来源地址https://www.toymoban.com/news/detail-428164.html

      // 定义结构体
      struct Stu
      {
      	char name[10];
      	int age;
      	char sex[5];
      };
      
      // 使用结构指针
      void set_age(struct Stu* pStu)
      {
      	pStu->age = 20;
      }
      
      // 使用结构体
      void print_age(struct Stu stu)
      {
      	printf("%d\n", stu.age);
      }
      
      int main()
      {
      	struct Stu stu;
      	set_age(&stu);
      	print_age(stu);  // 20
      	return 0;
      }
      

到了这里,关于C语言的操作符的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux bash shell变量操作符 —— 筑梦之路

    ${var} 返回变量var的内容,单独使用时有没有{}一样,混合多个变量和常量时,用{}界定变量名 ${#var} 返回变量var内容的长度 ${var:offset} 从变量var中的偏移量offset开始截取到字符串结尾的子字符串,offset从0开始 ${var:offset:length} 从变量var中的偏移量offset开始截取长度为length的子字

    2024年02月04日
    浏览(42)
  • 【C语言初阶】带你轻松玩转所有常用操作符(1) ——算数操作符,移位操作符,位操作符

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近要准备期末复习了,可能更新的就不会那么频繁了,下个星期恢复正常更新。 今天给大家带来的是操作符详解,由于这部分的内容比较多,可能会分成几部分讲,今天带来的是第一部分的内容,废

    2024年02月11日
    浏览(46)
  • 初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(57)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(69)
  • <C语言> 操作符

    加法(+):用于将两个操作数相加。 减法(-):用于将第一个操作数减去第二个操作数。 乘法(*):用于将两个操作数相乘。 除法(/):用于将第一个操作数除以第二个操作数。 取模(%):用于求两个操作数相除的余数。 乘法、除法和取模具有相同的优先级,高于加法

    2024年02月12日
    浏览(54)
  • 【C语言】操作符

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员操作符 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只

    2024年01月16日
    浏览(52)
  • linq中的操作符

    LINQ(Language Integrated Query)是一种用于.NET平台的查询语言,用于查询和操作各种数据源,如集合、数据库和XML。LINQ提供了一组标准查询操作符,用于执行各种查询操作。 LINQ(Language Integrated Query)是一种用于.NET平台的查询语言,用于查询和操作各种数据源,如集合、数据库

    2024年02月14日
    浏览(35)
  • c语言---操作符(详解)

    算术操作符: + 、- 、*、/ 、% 移位操作符: 位操作符: | ^ ` 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、= 、= 、= 、|= 、^= 单⽬操作符: !、++、–、、 、+、-、~ 、sizeof、(类型) 关系操作符: 、= 、 、= 、 == 、 != 逻辑操作符: 、|| 条件操作符: ? : 逗号表达式: , 下标引⽤: [

    2024年02月22日
    浏览(46)
  • C语言:“~”操作符详解

    ~:含义及用法举例 文章目录 前言 一、“~”是什么? 二、原码、反码及补码 1.简介 2.用法举例 ①正整数 ②负整数 ③零 三、“~”操作符 1.简介 2.用法举例 ①正整数 ②负整数 ③零 本文在简单介绍原码反码补码的基础上,介绍“~”操作符的用法。 ~:一种单目操作符,即对

    2024年02月10日
    浏览(53)
  • C语言---操作符详解

    算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号操作符 下标引用、函数调用和结构成员。 移位操作符,移动的是二进制位。 警告:对于移位运算符,不要移动负位数,这个是标准定义的。 3.1.1、原码、反码、补码介绍 整数

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包