当前位置: 首页 > news >正文

初识C语言 | 第4篇

文章目录

  • 内置数据类型
  • 操作数
        • 核心释义
        • 分类举例
  • 操作符
        • 算数操作符
        • 位操作符
        • 赋值操作符
        • 单目操作符
        • 关系操作符
        • 逻辑操作符
        • 条件操作符
        • 逗号表达式
        • 下标引用、函数调用和结构成员操作符
  • 常用关键字
        • 数据类型相关
        • 流程控制相关
        • 存储类型与作用域相关
        • 其他
  • 变量命名

内置数据类型

  • 本质:数据类型就是给计算机下达的“圈地指令”。它规定了变量在内存中占据的空间大小(字节数)以及数据的存储格式(如何解读二进制)。
  • 作用:决定了数据能存多大范围、精度如何,是程序运行的基石。
  • 常用
    • char (字符/小整数,1字节)
    • short (短整型,2字节)
    • int (基本整型,4字节,32/64位系统通用)
    • long (长整型,4字节Windows32/64位)
    • long long (长长整型,8字节)
    • float (单精度浮点,通常4字节)
    • double (双精度浮点,通常8字节)
    • long double (扩展精度浮点,8字节)

操作数

核心释义
  • 参与运算的数据/变量/常量,就是运算符用来“加工处理”的原材料。
  • 运算符是动作,操作数是动作作用的对象。
分类举例
  1. 单目运算符:1个操作数
    !flag → 运算符 ! ,操作数: flag
    &a → 运算符 & ,操作数: a
  2. 双目运算符:左右2个操作数
    a + 5 → 运算符 + ,左操作数 a ,右操作数 5
    x > y → 运算符 > ,操作数: x 、 y
  3. 三目运算符:3个操作数
    cond ? exp1 : exp2 → 三个操作数依次为 cond 、 exp1 、 exp2

一句话速记

运算符=干活的工具;操作数=工具要摆弄的料子。

操作符

算数操作符
  • 加法
    int main()
    {
    int sum = 3 + 5;
    printf(“%d\n”,sum);
    return 0;
    }
  • 减法
    int main()
    {
    int sum = 10 - 7;;
    printf(“%d\n”,sum);
    return 0;
    }
  • 乘法
    int main()
    {
    int sum = 3 * 5;
    printf(“%d\n”,sum);
    return 0;
    }
  • 除法
    int main()
    {
    int m = 15 / 5;
    printf(“%d\n”,m);
    return 0;
    }
  • 取摸(取余)
    int main()
    {
    int n = 5 % 3;
    printf(“%d\n”,n);
    return 0;
    }
  • 幂运算(求次方)
    int main()
    {
    int s = 2 ** 3;
    printf(“%d\n”,s);
    return 0;
    }
  • 整除(向下取整除法)
    int main()
    {
    int u = 9 // 5;
    printf(“%d\n”,u);
    return 0;
    }
位操作符

位操作符是对整数的二进制位逐位进行运算的操作符。

  • &:按位与
    • 示例:5 & 3 - > 1;//两位都为1才为1
    • 分析:5的二进制是101,3的二进制是011,按位与结果是001,对应十进制1
  • |:按位或
    • 示例:5 | 3 - > 7;//有一位为1就为1
  • 分析:5的二进制是101,3的二进制是011,按位或结果是111,对应十进制7
  • ^:按位异或
    • 示例:5 ^ 3 - > 6;//两位不同为1,相同为0
    • 分析:5的二进制是101,3的二进制是011,按位与结果是110,对应十进制6
  • ~:按位取反
    • 示例:~5 - > -6;//0变1,1变0,得补码
    • 分析:-5的二进制是101,对应的32进制数前面全是0;按位取反是010,对应32位二进制前面全是1,即得补码。补码最高位是1,为负数。对补码取反后加1,再转化为十进制数是6。即绝对值为6,最终结果为-6.(正数按位取反 ,其结果就是取相反数再减一;负数按位取反,结果是取绝对值减一)
  • <<:左移
    • 示例:5 << 1 - > 10;//各位左移,右侧补零
    • 分析:5的二进制是101,左移后为1010,对应十进制数是10
  • :右移

    • 示例:5 >> 1 - > 2;//各位右移,左侧补符号位
    • 分析:5的二进制是101,右移后为10,对应十进制数是2
  • :无符号右移

    • 示例:-1 >> 1 - > 2147483647,;//各位右移,左侧始终补0
    • 分析:计算机实际存储负数用的是补码,-1的补码是32个1。右移左侧补零,其余位位全1,对应十进制数为2147483647。
赋值操作符
  • 各操作符功能详解
    • = :基本赋值操作符,将右边的值直接赋给左边变量。例如: int a = 10;
    • += :加法赋值,等价于 a = a + b 。例如: a += 5; 表示 a 增加 5。
    • -= :减法赋值,等价于 a = a - b 。例如: a -= 3; 表示 a 减少 3。
    • *= :乘法赋值,等价于 a = a * b 。例如: a *= 2; 表示 a 乘以 2。
    • /= :除法赋值,等价于 a = a / b 。例如: a /= 4; 表示 a 除以 4。
    • &= :按位与赋值,等价于 a = a & b 。用于对二进制位进行“与”运算后赋值。
    • ^= :按位异或赋值,等价于 a = a ^ b 。用于对二进制位进行“异或”运算后赋值。
    • |= :按位或赋值,等价于 a = a | b 。用于对二进制位进行“或”运算后赋值。
    • ‘>>=’:右移赋值,等价于 a = a >> b 。将 a 的二进制位向右移动 b 位后赋值。
    • <<= :左移赋值,等价于 a = a << b 。将 a 的二进制位向左移动 b 位后赋值。
  • 使用注意事项
    • 复合赋值操作符具有隐式类型转换特性,例如 short s = 1; s += 1; 是合法的。但short s = 1; s = s + 1; 可能因类型提升而报错。’s = s + 1; ‘前面需要类型说明。
    • 赋值操作符的优先级较低,表达式会先计算右边,再执行赋值。
    • 位运算赋值操作符(如 &= , ^= , |= )常用于底层数据处理、标志位设置等场景。
单目操作符

只需要一个操作数就能完成运算的操作符。

  • ! :逻辑反操作,用于将布尔值取反。例如: if (!a) 表示当 a 为假(0)时条件成立。
    • 布尔值:只有两个固定取值的逻辑值
  • :负值操作符,用于取相反数。例如: int b = -a;
  • :正值操作符,通常用于显式表明正数,实际作用不大,但可用于强制类型提升。
  • & :取地址操作符,用于获取变量的内存地址。例如: int *p = &a;
  • sizeof :计算操作数所占内存字节数,是编译期常量。例如: sizeof(int) 返回 4(在32位系统上)。
  • ~ :按位取反操作符,对二进制每一位取反。例如: ~5 (即 ~0101 )结果为 -6 (补码表示)。- – :自减操作符,分为前置 --a 和后置 a-- ,前者先减后用,后者先用后减。
  • ++ :自增操作符,同样分前置 ++a 和后置 a++ ,语义与 – 类似。
    • :解引用操作符,用于访问指针所指向的内存内容。例如: int val = *p;
  • (类型) :强制类型转换操作符,用于显式转换数据类型。例如: (int)3.14 结果为 3。
关系操作符
  • :大于

  • = :大于等于

  • < :小于
  • <= :小于等于
  • != :不等于
  • == :等于
逻辑操作符
  • && (逻辑与):只有当左右两个条件都为真时,整个表达式才为真。例如: if (a >= 10 && b == 0) 表示“只有a大于等于10,且b为0”才允许执行if下的代码。

    • int main()
      {
      int a = 15;
      int b = 0;

    if (a >= 10 && b == 0)
    printf(“真\n”);
    else
    printf(“假\n”);
    return 0;
    }

  • || (逻辑或):只要左右两个条件中有一个为真,整个表达式就为真。例如: if (a >= 20 || b == 0) 表示“分a大于等于20或b等于0”即可执行if下的代码。

    • int main()
      {
      int a = 25;
      int b = 5;
      if (a >= 20 || b == 0)
      printf(“真\n”);
      else
      printf(“假\n”);
      return 0;
      }
条件操作符

条件操作符,也常被称为“三目运算符”

  • 其语法结构: exp1 ? exp2 : exp3
  • 作用:用于简化条件判断的简洁写法,功能等价于一个 if-else 语句,但更紧凑、适合在表达式中直接使用。
  • 执行逻辑非常直观:
    • 首先计算 exp1 (条件表达式)的值;
    • 如果 exp1 为真(非零),则整个表达式的结果是 exp2 的值;
    • 如果 exp1 为假(零),则整个表达式的结果是 exp3 的值。
  • 代码示例:
    int main()
    {
    int a = 10;
    int b = 15;
    int max = (a > b) ? a : b;
    printf(“%d\n”, max);
    return 0;
    }
逗号表达式
  • 语法形式: exp1, exp2, exp3, …, expN
  • 执行规则:从左到右依次计算每个表达式,整个逗号表达式的值是最后一个表达式 expN 的值。
  • 典型用途:常用于 for 循环的初始化或更新部分,或在需要多个表达式但只允许一个表达式的地方(如宏定义、函数参数)。
  • 示例:
    • int a = (1 + 2, 3 + 4); // a 的值是 7,因为逗号表达式取最后一个值
    • for (int i = 0, j = 10; i < j; i++, j–) { … }
下标引用、函数调用和结构成员操作符
  • [] — 下标引用操作符
    • 用于访问数组元素或指针所指向的内存位置。
    • 示例: arr[3] 表示访问数组 arr 的第4个元素(索引从0开始)。
  • () — 函数调用操作符
    • 用于调用函数,括号内可传入参数。
    • 示例: printf(“Hello”) 、 add(2, 3)
  • . — 结构体成员访问操作符(点操作符)
    • 用于访问结构体变量的成员。
    • 示例:
      struct Student s;
      s.age = 20; // 使用 . 访问结构体成员
  • -> — 指针访问结构体成员操作符(箭头操作符)
    • 用于通过结构体指针访问其成员。
    • 示例:
      struct Student *p = &s;
      p->age = 20; // 等价于 (*p).age = 20

常用关键字

数据类型相关

用于定义变量或数据的类型。

  • 基本类型: char , int , float , double , void (无)
  • 修饰符(用于改变类型的长度或符号): short , long , signed(有符号的) , unsigned (无符号的)
  • 自定义类型构造: struct (结构体), union (共用体), enum (枚举)
  • 类型重命名: typedef
流程控制相关

用于控制代码的执行顺序。

  • 条件判断: if , else , switch , case , default
  • 循环结构: for , do , while
  • 跳转语句: break , continue , goto , return
存储类型与作用域相关

用于定义变量的生命周期、可见性或存储位置。

  • 存储类说明符: auto (自动变量,默认), static (静态), extern (外部声明), register (寄存器)
  • 类型限定符: const (常量/只读), volatile (易变/防止优化)
其他

运算符: sizeof (计算大小)

变量命名

  • 变量命名应“见名知义”(语义化)

    • 变量名应当清晰地表达其代表的含义,避免使用无意义的字符。
    • 例如,使用 int age 来存储年龄,能够让人一眼看出该变量的用途;
    • 而如果使用 int a 或 int aaa 来命名,虽然语法合法,但无法体现变量的实际意义,会极大降低代码的可读性。
  • 变量命名需遵守硬性语法规则

    • 变量名只能由字母(a-z, A-Z)、数字(0-9)和下划线(_)组成,且绝对不能以数字开头。
    • 此外,C语言严格区分大小写, Age 和 age 会被视为两个不同的变量。
  • 变量命名不能是关键字

    • 变量名严禁使用C语言的32个标准关键字(如 int , float , if , else , return 等)。
    • 这些关键字已被系统赋予了特定的语法含义,如果用作变量名,会导致编译器报错。
http://www.jsqmd.com/news/1135246/

相关文章:

  • OBS背景移除插件:无需绿幕的智能抠像解决方案
  • 一条停水通知花了几小时,AI 员工能不能把它压缩到几秒?
  • 51单片机多功能台灯
  • Appium安装遇ERR_TLS_CERT_ALTNAME_INVALID?5步彻底解决证书验证失败
  • 【喵汪星球HarmonyOS 6.0】技术实战 09:健康症状库、关键词匹配与应急就医卡
  • 实体店小程序搭建工具:餐宝盈/BBWEYY/比文云/Instapage/Mobirise实测对比,含零代码SAAS、AI编程、源码定制交付
  • 人生未来的最小单位是什么?
  • 大模型术语:小白程序员必备的六层工程分层架构(收藏版)
  • 计算机毕业设计 BUG管理系统毕业论文
  • iStoreOS网络架构重构:从基础路由到智能家庭网络核心
  • 聚簇索引回表与覆盖索引
  • STM32L4与74HC32实现低功耗多键盘管理方案
  • 4#深萃--全流程深度解析
  • DDIC 的未来,传统 ABAP Dictionary 向 CDS 原生数据模型的迁移路线
  • 【VTG】 VTG-LLM: Integrating Timestamp Knowledge into Video LLMs for Enhanced Video Temporal Ground
  • OpenBMC:Redfish 管理接口
  • Unity 物理系统与 C# 脚本交互:3 种控制小球移动方案的性能与手感对比
  • 3种方法解决Navicat试用到期问题:Mac用户的终极重置指南
  • Windows系统文件autopilot.dll丢失找不到问题解决
  • 掌握Loop Engineering:让AI持续自主完成任务,小白程序员必备收藏指南!
  • 把 Claude Code auto memory 当成一套工程治理开关来看
  • 跨手机微信记录转移教程,再也不怕聊天记录清空避雷省钱向
  • WSA-Pacman:告别ADB命令,Windows安卓应用管理的革命性解决方案
  • Midscene.js:视觉驱动UI自动化,告别脆弱选择器
  • 新手跨境电商独立站搭建工具实测对比:BBWEYY/比文云/Framer/Prismic(2026年7月更新)含零代码SAAS、AI编程、源码定制交付
  • 基于DGN的电工基础-1
  • YOLOv11【第十章:前沿演进与跨界融合篇·第29节】元宇宙 YOLOv11 商业化落地全路径!
  • Scikit-learn 1.5.0 波士顿房价预测:7种回归模型R2对比与过拟合分析
  • 【VTG】T2SGrid: Temporal-to-Spatial Gridification for VTG
  • 3个技巧解决跨平台多媒体开发难题:SFML实战指南