目录

前文列表

程序编译流程与 GCC 编译器

C 语言编程 — 基本语法

C 语言编程 — 基本数据类型

C 语言编程 — 变量与常量

运算符

运算符是一种告诉编译器执行特定的算数或逻辑操作的符号。

  • 操作对象:又称操作数,是参与计算求值的最小数据单元。操作数可以为常量、变量、函数等。
  • 表达式:用运算符将操作对象连接起来可以构成表达式。表达式是用于计算的式子,是计算求值的基本单位。
  • 优先级:高优先级的运算符先进行运算,低优先级的运算符后进行运算。
  • 结合性:决定了运算符的运算方向。
    • 左结合性:当运算符为从左到右进行运算,那么称这个运算符为左结合性运算符
    • 右结合性:当运算符为从右到左进行运算,那么称这个运算符为右结合性运算符

NOTE

  • 当一个表达式中出现多个运算符时,需要考虑运算符的优先级和结合性是否影响表达式的求值顺序。
  • 当两个运算符相同优先级时,由运算符的结合性来决定运算顺序。
  • 在表达式中使用圆括号 () 可以改变表达式的运算顺序。

算数运算符

NOTE:求余运算符的操作数只可以为整型。

自增、自减运算符

  • i++ :先取值,后自加。使用 i 之后,i=i+1
  • ++i :先自加,后取值。i=i+1 后,再使用 i
  • i- - :先取值,后自减。使用 i 之后,i=i-1
    • -i :先自减,后取值。i=i-1 后, 再使用 i

NOTE:自增运算符和自减运算符的操作数只可以为变量,不能为常量或表达式。

比较运算符

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

NOTE:比较表达式的运算结果值是 0(假)或 1(真)。C 语言没有 bool 类型,用整数值 0 来表示假,用非 0 值来表示真 。C++ 为提高程序的可读性引入了 bool 类型,bool 类型变量的值为 true 或 false。C++ 为了保持对 C 语言的兼容性,false 用 0 来表示,ture 用 1 来表示。

逻辑运算符

逻辑表达式:用逻辑运算符将操作对象连接起来的式子,称为逻辑表达式。

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



NOTE:当逻辑表达式中同时出现多种运算符时,按下列顺序进行运算:算术运算→关系运算→逻辑运算。

位运算符

位运算符作用于位,并逐位执行操作。&(全一则一)、|(有一则一)、^(异或)、~(取反)的真值表如下所示:





假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

A = 0011 1100

B = 0000 1101

  • A&B = 0000 1100
  • A|B = 0011 1101
  • A^B = 0011 0001
  • ~A = 1100 0011

赋值运算符

赋值运算表达式:用赋值运算符将变量和表达式连接起来的式子,称为赋值运算表达式。

多重赋值: V1=V2=...=Vn= 表达式。执行时,从右到左把表达式的值按照 Vn、… 、V2、V1 的顺序依次赋给每个变量。

赋值运算符可分为:

  • 基本赋值运算符: = 将一个数据赋给一个变量功能的运算符。
  • 复合赋值运算符:基本赋值运算符与算术运算符、位运算符等组成复合赋值运算符。

NOTE:

  • 赋值运算符的左侧必须为变量名,右侧必须为表达式。
  • 赋值运算表达式的值为赋值运算符左侧变量的数据值。
  • 赋值运算表达式的数据类型为左侧变量的数据类型。
  • 当出现右侧表达式的数据类型与左侧变量的数据类型不一致时,则会先把右边表达式的值进行强制数据类型转换后,再进行赋值。

逗号运算符

逗号运算符:又称为顺序求值运算符,功能是将表达式连接起来,从左向右求解各个表达式,逗号运算的值为最后的表达式 n 的值。

NOTE:逗号运算符的优先级最低,引入逗号表达式的目的是为了简化程序书写。

// C/C++ 按顺序计算表达式 1,表达式 2, .....,表达式 n 的值
// 整个逗号表达式的值为表达式 n 的值
表达式1, 表达式2, 表达式3, ......, 表达式n

sizeof 运算符

sizeof 运算符:求某一数据类型或某一变量在内存空间中所占空间的字节数。

sizeof(变量名或数据类型)

e.g.

int main()
{
char stringA[] = "Hello World!\r\n";
printf(" sizeif( char ) = %d\r\n", sizeof(char));
printf(" sizeif( int ) = %d\r\n", sizeof(int));
printf(" sizeif( long int ) = %d\r\n", sizeof(long int));
printf(" sizeif( float ) = %d\r\n", sizeof(float));
printf(" sizeif( double ) = %d\r\n", sizeof(double));
// 注意 stringA 的末尾还存放着 '\0'
printf(" sizeif( stringA ) = %d\r\n", sizeof(stringA)/sizeof(char));
return 0;
}

杂项运算符

包括 &(地址运算符)、*(指针运算符)、?:(三元运算符)。

#include <stdio.h>

int main(){
int a = 4;
short b;
double c;
int * ptr; printf("a: %lu\n", sizeof(a));
printf("b: %lu\n", sizeof(b));
printf("c: %lu\n", sizeof(c)); ptr = &a;
printf("*ptr: %d\n", *ptr); return 0;
}

运行:

# ./main
a: 4
b: 2
c: 8
*ptr: 4

注意:局部变量 ptr 被定义为指针类型,所以 ptr 可以存储变量的 “指针”,即变量的值在内存中的入口地址。ptr = &a; 存储了局部变量 a 的地址,再通过指针运算符 * 将局部变量 a 的值取出来。

  1. 指针变量:存储的内存地址。
  2. 将变量/函数的内存地址赋值给指针变量。
  3. 通过指针运算符将指针变量储存的内存地址所指向的值取出来。

运算符的优先级

较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

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

  1. 个人c语言编程风格总结

    总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...

  2. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  3. R语言编程艺术(4)R对数据、文件、字符串以及图形的处理

    本文对应<R语言编程艺术> 第8章:数学运算与模拟: 第10章:输入与输出: 第11章:字符串操作: 第12章:绘图 =================================== ...

  4. R语言编程艺术(3)R语言编程基础

    本文对应<R语言编程艺术> 第7章:R语言编程结构: 第9章:面向对象的编程: 第13章:调试 ============================================== ...

  5. R语言编程艺术(2)R中的数据结构

    本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...

  6. C++语言编程规范

    前言 这里参考了<高质量C++C 编程指南 林锐>.<google C++编程指南>以及<华为C++语言编程规范>编写了这份C++语言编程规范文档,以合理使用 C+ ...

  7. c语言编程基础入门必备知识

    数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单 ...

  8. C语言编程实现Linux命令——who

    C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...

  9. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  10. 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++

    前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...

随机推荐

  1. #线性dp#洛谷 5999 [CEOI2016]kangaroo

    题目 问有多少个长度为 \(n\) 的排列满足首项为 \(st\),末项为 \(ed\), 并且 \(\forall i\in (1,n),\left[a_{i-1}<a_i \oplus a_ ...

  2. C# Log4net详细说明

    1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...

  3. Buffer 与 Mat 互转

    Linux系统做音视频开发,很多时候要用到opencv,就需要把图片Buffer数据转换成Mat对象来使用 Buffer 转 Mat Mat Buffer2Mat(unsigned char* buf ...

  4. jenkins安装卸载和下载

    环境 :docker容器 卸载 jenkins 1.rpm卸载rpm -e jenkins 2.检查是否卸载成功rpm -ql jenkins 3.彻底删除残留文件:find / -iname jen ...

  5. HDC 2022 开发者主题演讲与技术分论坛干货分享(附课件)

     原文:https://mp.weixin.qq.com/s/axm6HyX0PqKCKksFxIfehg,点击链接查看更多技术内容.   11月4日-11月6日,HDC 2022在东莞成功举办,这是 ...

  6. Lite Actor:方舟Actor并发模型的轻量级优化

    原文:https://mp.weixin.qq.com/s/8biIBddpy6GKgakazg1vcg,点击链接查看更多技术内容. 并发模型是用来实现不同应用场景中并发任务的编程模型,通过合理地使用 ...

  7. centos 6.4下fdisk分区、格式化、挂载新硬盘

    centos 6.4下fdisk分区.格式化.挂载新硬盘 作者: cat 日期: 2013 年 9 月 10 日 发表评论 (0) 查看评论 1.# fdisk -l 查看当前磁盘信息,就会发现最下面 ...

  8. 牛客网-SQL专项训练14

    ①通过子查询的方式从衬衫表SHIRTABLE中选取出销售单价shirt_price高于全部衬衫的平均价格的衬衫名字:B 解析: 题目要求需要用到子查询,故排除AC选项,而D选项在where子句中使用了 ...

  9. 阿里云 ACK One 多集群管理全面升级:多集群服务、多集群监控、两地三中心应用容灾

    简介: 本文介绍了 ACK One 近期发布的 3 个主要特性,覆盖了多集群管理的 3 个主要场景,跨集群服务发现与访问.多集群全局监控.应用容灾.除多集群管理外,ACK One 更是支持连接并管理任 ...

  10. 阿里云 EMAS Serverless 重磅发布

    简介: EMAS Serverless 是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用.弹性伸缩的云开发服务,包含云函数.云数据库.云存储.静态网站托管等功能,可用 ...