目录

前文列表

程序编译流程与 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. #排序,去重#洛谷 5682 [CSPJX2019]次大值

    题目 分析 首先,显然要排序去重,考虑最大值应该是\(a_{n-1}\)(排序后) 那次大值只有可能出现在\(a_{n-2}\)或者\(a_n\bmod a_{n-1}\)中 当然去重后如果只有一个数 ...

  2. Java中的类型推断和lambda表达式

    目录 简介 类型的显示使用 Stream中的类型推断 类型推断中变量名字的重要性 类型推断对性能的影响 类型推断的限制 总结 简介 java是强类型的编程语言,每个java中使用到的变量都需要定义它的 ...

  3. Unity-PC 端调用SpVoice语音 (文字转语音)

    第一步引用文件 在VS当中 点击项目->添加引用-> 搜索Microsoft Speech Objecet Library 然后选中前面的白色方块点击确定就行了 插入之后 你的引用库中会多 ...

  4. UML 哲学之道——领域模型[四]

    前言 简单整理一下领域模型. 正文 领域模型是对领域内的概念类或现实中的对象的可视化表示 领域模型也称概念模型.领域对象模型和分析对象模型 领域模型是可以在业务建模科目中创建的制品之一 领域模型是up ...

  5. docker 应用篇————docker原理[三]

    前文 前面就已经介绍了docker的安装,在https://www.cnblogs.com/aoximin/p/12906218.html,这里面,这里作为重新整理. 那么这里就不介绍了,这里直接是进 ...

  6. mysql 在c# EF 中无法生成对象

    正文 1. 创建个vs2013项目,导入EntityFramework.dll. MySql.Data.dll. MySql.Data.Entity.EF6.dll 2. 工具 -> 扩展和更新 ...

  7. arp 的基础概念

    前言 打算整理网络这一块,先把概念写完. 就是有一个问题,那就是为什么有ip地址还有mac地址呢? 原因是这样子的,我们知道ip协议是第三层,那么有一个问题了,如果只有第三层的ip是否能过识别到主机? ...

  8. vue 商品sku添加,笛卡尔算法,商品添加。动态生成table,table添加值后 再生成的table 不改变table之前输入的值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. HarmonyOS NEXT应用开发之深色跑马灯案例

    介绍 本示例介绍了文本宽度过宽时,如何实现文本首尾相接循环滚动并显示在可视区,以及每循环滚动一次之后会停滞一段时间后再滚动. 效果图预览 使用说明: 1.进入页面,检票口文本处,实现文本首尾相接循环滚 ...

  10. 一种关于低代码平台(LCDP)建设实践与设计思路

    简介: 作者在负责菜鸟商业中心CRM系统开发过程中发现有一个痛点:业务线很多,每个业务线对同一个页面都有个性化布局和不同的字段需求,而他所在的团队就3个人,那么在资源有限的情况下该如何支撑呢?本文就降 ...