算术运算

C 语言支持 + - * / % 五种运算,加减乘除取模。

所有 CPU 都内建加法器,可以完成加法操作。减法操作可以转为加法操作。大部分 CPU 都没有内置乘法器,此时编译器会把 * / 乘除运算转为加法运算,用软件来模拟乘法。

逻辑运算

逻辑运算的返回结果是 1 或 0,C 语言中没有布尔类型,真假即用 1 和 0 代替。

|| 和 &&

逻辑与 &&:两侧表达式都为真时,表达式为真,否则为假。

逻辑或 ||:两侧表达式都为假时,表达式才为假,否则为真。

注意:C 语言在处理逻辑与 && 和逻辑或 || 时,如果逻辑与的左表达式为假或逻辑或的左表达式为真,则不会再执行右表达式。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 6;
  5. int res;
  6. res = ((a == 6) || printf("right express run\n"));
  7. printf("end of main,res is:%d\n", res);
  8. }

输出为:

  1. end of main,res is:1

>、>=、<、<=

跟数学中的比较运算一致。

! 逻辑取反

  1. int a = 0x0;
  2. if (!a) printf("hello"); // a 逻辑取反后变成1,这一行会打印

?:

三目运算符。a ? b : c 中,a 表达式为真时执行 b,否则执行 c。

位运算

<< 和 >>

按位左移 <<:相当于乘法,左移 n 位相当于乘以2的n次方。最低位一律补0。

按位右移 >>:相当于除法,右移 n 位相当于除以2的n次方。有符号数最高位补符号位(负数补1,正数补0),无符号数最高位补0。

例如对于 0x1(0000 0001),左移一位后,变为 0x2(0000 0010)。乘以 32 相当于左移 5 位。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char a = 0x1;
  5. int i;
  6. for (i = 0; i < 8; i++)
  7. {
  8. a = a<<1;
  9. printf("0x%x\n", a);
  10. }
  11. a = 1;
  12. for (i = 0; i < 8; i++)
  13. {
  14. a = a>>1;
  15. printf("0x%x\n", a);
  16. }
  17. a = -1;
  18. for (i = 0; i < 8; i++)
  19. {
  20. a = a>>1;
  21. printf("0x%x\n", a);
  22. }
  23. unsigned char b = -1;
  24. for (i = 0; i < 8; i++)
  25. {
  26. b = b>>1;
  27. printf("0x%x\n", b);
  28. }
  29. }

&、|、^

  • 按位与 &:任意位与 0 按位与,得到0。按位与可以用来屏蔽某位。例如 a & 0xf0 可以屏蔽低 4 位。
  • 按位或 |:任意位与 1 按位或,得到1。按位或可以用来开启某位。例如 a | 0xf0 可以开启高 4 位。
  • 按位异或 ^:两位不同则为 1,否则为 0。主要用作算法上,工程上用的少。例如不借助中间变量交换两个变量的值:
  1. a = a ^ b;
  2. b = a ^ b;
  3. a = a ^ b;

& 也叫清零器,| 也叫设置器。例如,将变量的第3位设置为1或清除为0:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char a = 0x1; // 0000 0001
  5. a = a | (1 << 3); // 0000 1001
  6. printf("%x\n", a);
  7. a = a & (~(1 << 3)); // 0000 0001,为了安全,这里不要直接计算
  8. printf("%x\n", a);
  9. }

~ 按位取反

0xf0 按位取反得到 0x0f。

赋值运算

除了 = 赋值运算外,还可以在 C 语言中使用符合赋值运算符 +=、-=、*=、/= 、%=、&=、|=。例如上面的例子可以变成:

  1. a |= (1 << 3); //a = a | (1 << 3);
  2. a &= (~(1 << 3)); //a = a & (~(1 << 3));

内存访问运算

小括号

小括号除了可以改变优先级外,还可以用于函数访问。

中括号

方括号可以用在数组声明定义和使用中,用于访问指定内存。

大括号

函数体、struct、union 体。

成员变量访问符 -> 和 .

->:地址访问。声明了指向 struct 类型的指针后,通过 -> 访问其中元素。

.:变量访问。声明了 struct 类型的变量后,通过 . 访问其中元素。

  1. #include <stdio.h>
  2. #include <string.h>
  3. typedef struct People
  4. {
  5. char name[20];
  6. int id;
  7. } peo;
  8. int main()
  9. {
  10. struct People p1;
  11. peo* p2;
  12. strcpy(p1.name, "hello");
  13. p1.id = 666;
  14. printf("%s, %d\n", p1.name, p1.id);
  15. p2->id = 888;
  16. printf(" %d\n", p2->id);
  17. }

& 和 *

& 作为单目运算符,后面跟变量时,表示取地址运算符。作为双目运算符时,表示按位与。

* 作为单目运算符,后面跟变量时,表示指针运算符。作为双目运算符时,表示乘法。

C 语言的运算符的更多相关文章

  1. C语言位运算符:与、或、异或、取反,左移和右移

    C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...

  2. C语言预处理运算符

    转自C语言预处理运算符 预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号)    -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@   ...

  3. C语言位运算符:与、或、异或、取反、左移和右移

    语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...

  4. go语言的运算符

    什么是运算符:运算符用于在程序运行时执行数学或逻辑运算 go语言的运算符如下: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 其他运算符 一,算数运算符 运算符 描述 实例 + 相加 A ...

  5. C语言的运算符的优先级与结合性+ASCII表

    [0]README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻): Alert)以下内容转自:h ...

  6. 3014C语言_运算符

    第四章 运算符 4.1 分类 C语言的运算符范围很广,可分为以下几类: 1.算术运算符:用于各类数值运算.包括加(+).减(-).乘(*).除(/).求余(%).自增(++).自减(--)共七种. 2 ...

  7. go语言基本运算符

    go语言基本运算符 1.算术运算符 以下假设A=10,B=20: 2.关系运算符 以下假设A=10,B=20: 3.逻辑运算符 以下假设A=true,B=false: 4.位运算符 十进制转二进制: ...

  8. 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...

  9. 关于C语言中运算符优先级的一次错误

    好久没碰编程了,最近有点闲,又拾起来.做了个简单的网络测试程序,测试的时候发现有条语句老是获取不到结果.如下: if(portnumber=atoi(argv[1])>65535) portnu ...

  10. c语言位运算符

    C语言既具有高级语言的特点,又具有低级语言的功能. 所谓位运算是指进行二进制位的运算. C语言提供的位运算: 运算符   含义  &   按位与  |   按位或  ∧   按位异或  ∽   ...

随机推荐

  1. VUE点击颜色选中

  2. Linux学习--第十三天--日志、系统运行级别、grub加密

    日志 rsyslogd取代了syslogd. /var/log/cron #定时任务相关日志 /var/log/cups #打印信息相关日志 /var/log/dmesg #开机内核自检相关日志,dm ...

  3. puppet工简介一

    puppet简介一 puppet工作原理 puppet 是一个配置管理工具, 典型的, puppet 是一个 C/S 结构, 当然,这里的 C 可以有很多,因 此,也可以说是一个星型结构. 所有的 p ...

  4. Linux磁盘分区与lvm逻辑卷

    硬盘接口的种类分四类:(价格由低到高) IDE SATA硬盘:别名串口硬盘,具有较强的纠错能力. SCSI硬盘:即采用SCSI接口的硬盘,SCSI接口具有应用范围广,多任务,带宽大,CPU占用率低. ...

  5. SpringBootMVC02——SpringDataJpa与ThymeLeaf

    大纲 - SpringDataJpa进阶使用- SpringDataJpa自定义查询- 整合Servlet.Filter.Listener- 文件上传- Thymeleaf常用标签 1.整合Servl ...

  6. Window10的激活步骤

    1. 首先,我们先查看一下Win10正式专业版系统的激活状态: 点击桌面左下角的“Windows”按钮,从打开的扩展面板中依次点击“设置”-“更新和安全”,并切换到“激活”选项卡,在此就可以查看到当前 ...

  7. mysql笔记——索引

    什么是索引? 数据库中的一个对象. 在数据库中用来加速表的查询. 通过使用快速路径访问方法定位数据,减少了磁盘的i/o. 与表分别独立存放,但不能独立存在,必须属于某个表. 由数据库自动维护,表被删除 ...

  8. spark数据倾斜与解决方法

    一.数据倾斜 数据倾斜一般发生在对数据进行重新划分以及聚合的处理过程中.执行Spark作业时,数据倾斜一般发生在shuffle过程中,因为Spark的shuffle过程需要进行数据的重新划分处理.在执 ...

  9. Text-CNN 文本分类

    1.简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classifica ...

  10. Codeforces 962D Merge Equals ( 模拟 )

    题意 : 给出一个序列,然后每次将重复出现的元素进行求和合并(若有多个,则优先取最小的进行合并),若某重复元素有很多,那么取最左边的那两个进行合并且合并后元素位于原来右边元素的位置,例如 3 2 6 ...