C语言入门2-数据类型、运算符和表达式

news2024/10/25 14:25:54

变量命名

命名规范

  • 只能由字母(含"_")和数字组成;
  • 首字母不能是数字;
  • 不能与关键字重名,例如floatdoubleif等。

注意事项

  • 不使用"_"开头,因为很多库函数这样命名,容易冲突;
  • 区分大小写;
  • 变量名使用小写字母,符号常量使用大写字母;
  • 局部变量使用短变量名,全局变量使用长变量名。

数据类型

基本数据类型

  • char 单字节
  • short 一般为双字节
  • int 一般为四个字节
  • long 一般为八个字节
  • float 单精度
  • double 双精度

常量

整型常量

  • 1234 int类型
  • 1234L或1234l long类型

浮点型常量

  • 123.4或1e-2(0.01)double类型
  • 123.4f或123.4F float类型
  • 123.4L long double类型

八进制和十六进制常量

  • 037 八进制
  • 0x1f或0X1F 十六进制

字符常量

  • ‘0’

常用符号常量表:
在这里插入图片描述
举例:编写一个统计字符串的字符数的函数。

int strlen(char str[]) {
    int i;
    
    i = 0;
    while (str[i] != '\0')
        ++i;
    return i;
}

枚举常量

int main() {
    enum boolean {NO = 0, YES = 1};

    enum boolean flag = NO;

    printf("%d\n", flag);
}

变量声明

第一种方式:

int  lower, upper, step;
char c, line[1000];

第二种方式:

int  lower;
int upper;
int step;
char c;
char line[1000];

第三种方式,声明式赋值:

char  esc = '\\';
int   i = 0;
int   limit = MAXLINE+1;
float eps = 1.0e-5;

使用const关键字声明不变量:

const double e = 2.71828182845905;
const char msg[] = "warning: "; 
// 还用用在函数的参数上
int strlen(const char[]);

算术运算符

二元运算符

  • + 加
  • - 减
  • * 乘
  • / 除
  • % 取模
    举例:判断年份是否为闰年。
int main() {
    int year = 2011;

    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
        printf("%d is a leap year\n", year);
    else
        printf("%d is not a leap year\n", year);
}

关系和逻辑运算符

关系运算符

> >= < <= == !=

注意:因为算术运算符优先级高于关系运算符,所以i < lim - 1会被视作i < (lim - 1)
逻辑运算符

  • && 且
  • || 或
  • ! 取反

类型转换

隐式类型转换(自动类型转换)

  • 当不同数据类型的操作数参与运算时,编译器会自动将它们转换为同一类型,以便于执行运算。
  • 转换规则通常是基于操作数的数据范围和精度,较小的数据类型会被转换为较大的数据类型。
  • 例如,char 类型和 int 类型相加时,char 类型通常会被转换为 int 类型。

显式类型转换(强制类型转换):

  • 使用强制类型转换运算符 (type) 来明确指定将一个类型的值转换为另一种类型。
  • 程序员需要在代码中明确写出转换的类型,以确保转换的意图是清晰的。
  • 例如,(int)3.14 将 double 类型的 3.14 转换为 int 类型,结果是 3。

举例
将字符串转换为整数。

#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:将接收一个字符串s,并返回其数值形式
int atoi(char s[]);

int main(void) {
    char s[] = "1234"; // 定义一个字符串数组s,并初始化为"1234"
    printf("%d\n", atoi(s)); // 调用atoi函数,并将结果打印出来
}

// 函数定义:实现字符串转换为整数
int atoi(char s[]) {
    int i, n; // 定义循环计数器i和数值n

    n = 0; // 初始化数值n为0
    // 循环遍历字符串s,直到遇到非数字字符或字符串结束
    for (i = 0; s[i] >= '0' && s[i] <= '9'; i++) {
        // 将字符转换为数值并累加到n上
        n = 10 * n + (s[i] - '0');
    }
    return n; // 返回计算得到的数值
}

在循环中,通过 s[i] - ‘0’ 将字符转换为相应的整数值。例如,字符 ‘5’ 转换为整数 5。
练习

  1. 编写一个函数 htoi(s),将一串十六进制数字(包括可选的 0x 或 0X)转换为其等效的整数值。
#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:将接收一个表示十六进制数的字符串s,并返回其数值形式
int htoi(char s[]);

int main(void) {
    char s[] = "0x1af"; // 定义一个字符串数组s,并初始化为"0x1af"
    printf("%d\n", htoi(s)); // 调用htoi函数,并将结果打印出来
}

// 函数定义:实现十六进制字符串转换为十进制整数
int htoi(char s[]) {
    int i, n; // 定义循环计数器i和数值n

    n = 0; // 初始化数值n为0
    // 从字符串的第三个字符开始循环遍历(跳过前缀"0x")
    for (i = 2; 
         (s[i] >= '0' && s[i] <= '9') || 
         (s[i] >= 'a' && s[i] <= 'z') || 
         (s[i] >= 'A' && s[i] <= 'Z'); 
         i++) {
        // 根据字符在ASCII表中的位置计算数值
        switch(s[i]) {
            case 'a': case 'A': // 对小写和大写的'a'或'A'进行处理
                n = 16 * n + 10; // 十六进制的'a'或'A'对应十进制的10
                break;
            case 'b': case 'B': // 对小写和大写的'b'或'B'进行处理
                n = 16 * n + 11; // 以此类推
                break;
            // ... 其他字符的处理
            case 'f': case 'F':
                n = 16 * n + 15; // 十六进制的'f'或'F'对应十进制的15
                break;
            default: // 对数字0-9的处理
                n = 16 * n + (s[i] - '0'); // 直接转换
                break;
        }
    }
    return n; // 返回计算得到的数值
}

增量和减量运算符

前缀递增/递减

  • 先将变量的值加一/减一,然后返回新值。

后缀递增/递减

  • 先返回变量的值,然后变量值加一/减一。

举例

  1. 从字符串中移除所有的指定字符。
#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:从字符串s中删除所有出现的字符c
void squeeze(char s[], int c);

int main() {
    char s[] = "Hello world!"; // 定义一个字符串数组s,并初始化为"Hello world!"
    squeeze(s, 'l'); // 调用squeeze函数,删除s中的所有'l'字符

    printf("%s\n", s); // 打印修改后的字符串s
}

// 函数定义:从字符串s中删除所有出现的字符c
void squeeze(char s[], int c) {
    int i, j; // 定义循环计数器i和用于跟踪新字符串结束位置的j

    // 使用for循环和i作为计数器,j用于重写修改后的字符串
    for (i = j = 0; s[i] != '\0'; i++) {
        // 如果当前字符不是要删除的字符c
        if (s[i] != c) {
            // 将当前字符复制到s[j]的位置,然后递增j
            s[j++] = s[i];
        }
    }
    // 在新字符串的末尾添加空字符,标记字符串结束
    s[j] = '\0';
}
  1. 把一个字符串拷贝另一个字符串末尾。
#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:将字符串t连接到字符串s的末尾
void StrCat(char s[], char t[]);

int main() {
    char s[100] = "Hello world!"; // 定义一个足够大的字符数组s,并初始化为"Hello world!"
    char t[] = " nihao shijie";   // 定义一个字符串数组t,并初始化为" nihao shijie"
    StrCat(s, t);                // 调用StrCat函数,将t连接到s的末尾

    printf("%s\n", s); // 打印连接后的字符串s
}

// 函数定义:将字符串t连接到字符串s的末尾
void StrCat(char s[], char t[]) {
    int i, j; // 定义循环计数器i和j

    i = j = 0; // 初始化计数器i和j为0
    // 使用while循环找到s字符串的结束位置
    while (s[i] != '\0')
        i++;
    // 从s的末尾开始,将t字符串的每个字符复制到s中
    while ((s[i++] = t[j++]) != '\0')
        ; // 空循环体,直到t字符串结束
}

练习

  1. 编写 squeeze(s1,s2) 的另一个版本,删除 s1 中与字符串 2 中的字符匹配的每个字符。
#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:从字符串s中删除所有在字符串t中出现的字符
void squeeze(char s[], char t[]);

int main() {
    char s[] = "Hello world!"; // 定义一个字符串数组s,并初始化为"Hello world!"
    char t[] = " lo";          // 定义一个字符串数组t,并初始化为" lo"
    squeeze(s, t);             // 调用squeeze函数,删除s中所有在t中出现的字符

    printf("%s\n", s); // 打印修改后的字符串s
}

// 函数定义:从字符串s中删除所有在字符串t中出现的字符
void squeeze(char s[], char t[]) {
    int i, j, z; // 定义循环计数器i, j和用于跟踪新字符串结束位置的z

    // 外层循环:遍历字符串t中的每个字符
    for (i = 0; t[i] != '\0'; i++) {
        z = 0; // 重置z为0,准备构建新的字符串
        // 内层循环:遍历字符串s中的每个字符
        for (j = 0; s[j] != '\0'; j++) {
            // 如果s[j]不等于t[i],则将其复制到s的前面位置
            if (s[j] != t[i]) {
                s[z++] = s[j]; // 复制字符,并递增z
            }
        }
        // 内层循环结束后,在新字符串的末尾添加空字符
        s[z] = '\0';
    }
}
  1. 编写函数 any(s1,s2),返回字符串 s1 中第一个出现字符串 s2 中任意字符的位置,如果 s1 不包含 s2 中的字符,则返回 -1。
#include <stdio.h> // 引入标准输入输出库,用于printf函数

// 函数声明:检查字符串t中的任意字符是否出现在字符串s中
int any(char s[], char t[]);

int main() {
    char s[] = "Hello world!"; // 定义一个字符串s,并初始化为"Hello world!"
    char t[] = "l";            // 定义一个字符串t,并初始化为"l"
    // 调用any函数,检查t中的字符是否出现在s中,并打印返回的索引或-1
    printf("%d\n", any(s, t));
}

// 函数定义:检查字符串t中的任意字符是否出现在字符串s中
int any(char s[], char t[]) {
    int i, j; // 定义循环计数器i和j

    // 外层循环:遍历字符串t中的每个字符
    for (i = 0; t[i] != '\0'; i++) {
        // 内层循环:遍历字符串s中的每个字符
        for (j = 0; s[j] != '\0'; j++) {
            // 如果在s中找到与t[i]匹配的字符,则返回当前索引j
            if (s[j] == t[i])
                return j; // 返回匹配字符在s中的索引
        }
    }
    // 如果遍历完t中的所有字符都没有找到匹配项,则返回-1
    return -1;
}

三元表达式

z = (a > b) ? a : b;    /* z = max(a, b) */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1842472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】已解决java.sql.SQLRecoverableException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLRecoverableException异常 在Java的数据库编程中&#xff0c;java.sql.SQLRecoverableException是一个重要的异常&#xff0c;它通常表示一个可以恢复的SQL异常。…

思维导图之计算机网络整体框架

高清自行访问&#xff1a;计算机网络整体框架 (yuque.com)

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端&#xff0c;它不仅可以与OEM云服务器通信接收OTA推送&#xff0c;还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等&#xff0c;借…

微信小程序 this.setData高级用法(只更改单个数据)

合理使用 setData | 微信开放文档 1、页面 <view class"h-100px"></view> <view>最简单的数据&#xff1a;</view> <button bind:tap"handleAdd" data-type"1">点我加 1&#xff1a; {{text}}</button> &…

计算几何【Pick定理】

Pick 定理 Pick 定理&#xff1a;给定顶点均为整点的简单多边形&#xff0c;皮克定理说明了其面积 A {\displaystyle A} A 和内部格点数目 i {\displaystyle i} i、边上格点数目 b {\displaystyle b} b 的关系&#xff1a; A i b 2 − 1 {\displaystyle Ai{\frac {b}{2}}…

【Python驯化-01】python中set去重数据每次结果不一致问题解决

【Python驯化-01】python中set去重数据每次结果不一致问题解决 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注…

计算机网络 —— 应用层(万维网)

计算机网络 —— 应用层&#xff08;万维网&#xff09; 万维网核心组成部分特点 URLHTTP版本请求消息结构响应消息结构工作流程 Cookie如何工作主要用途安全与隐私类型 Web缓存客户端缓存&#xff08;浏览器缓存&#xff09;服务器端缓存 今天我们来了解万维网&#xff1a; 万…

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时&#xff0c;子组件接收到的 children 是一个数组&#xff0c;通过解析数组中各 JSX 的属性 slot &#xff0c;即可实现具名插槽的分发&#xff01; 代码实现 Father.jsx import Child from "./Child";…

Java中OOP的概念及示例

Java中OOP的概念及示例 在本指南中&#xff0c;您将学习Java中的OOP概念。面向对象编程系统&#xff08;OOP&#xff09;是一种基于“对象”的编程概念。面向对象编程的主要目的是提高程序的可读性、灵活性和可维护性。 面向对象编程将数据及其行为集中在一个称为对象的实体中…

小学生杂志小学生杂志社小学生编辑部2024年第5期目录

教学研究 小学数学教学中易错题的纠正策略研究 黄喜军; 1-3 主题语境下小学英语作业多模态设计与实施策略研究 韩蓓; 4-6 小学美术教育中色彩教学的实施措施研究 顾雅洁; 7-9《小学生》投稿&#xff1a;cn7kantougao163.com 核心素养视域下小学英语单元整体教学…

Linux 6.10也引进了蓝屏机制

众所周知&#xff0c;win死机后会有个蓝屏死机的故障提示页面&#xff0c;Linux 6.10 开始也将引入这个机制。 Linux 6.10 引入了一个新的 DRM Panic 处理程序基础设施&#xff0c;以便于在致命错误&#xff08;Panic&#xff09;发生时显示相关信息。 Linux 6.10 还在开发之…

如何高效应用与精准选择温补晶振

温补晶振(TCXO)是一种重要的时序元件&#xff0c;因其高精度和高稳定性在通信、导航、测控等多个领域中扮演着关键角色。晶发电子接下来将为您详细阐述温补晶振的选用和使用方法&#xff0c;助您更好地理解和运用这一核心元件。 一、温补晶振的工作原理 温补晶振能够实现在广…

2024年【N1叉车司机】报名考试及N1叉车司机考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机报名考试参考答案及N1叉车司机考试试题解析是安全生产模拟考试一点通题库老师及N1叉车司机操作证已考过的学员汇总&#xff0c;相对有效帮助N1叉车司机考试资料学员顺利通过考试。 1、【多选题】《特种设备…

Tailwindcss 扩展默认配置来自定义颜色

背景 项目里多个Tab标签都需要设置同样的背景颜色#F1F5FF&#xff0c;在集成tailwindcss之前就是重复该样式&#xff0c;如下图&#xff1a; .body {background-color: #f1f5ff; }集成tailwindcss时&#xff0c;我们希望在class中直接设置该背景色&#xff0c;但是默认的tai…

不懂索引,简历上都不敢写自己熟悉SQL优化

大家好&#xff0c;我是考哥。 今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握SQL优化还重要&#xff0c;索引是优化SQL的前提和基础&#xff0c;我们一步步来先打好地基。 当MySQL表数据量不大时&#xff0c;缺少索引对查询性能的影响不会太大&#x…

递归算法:代码迷宫中的无限探索

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一 深入理解递归 二 迭代VS递归 三 递归算法题目解析 3.1 汉诺塔问题 3.2 合并两个有序链表 3.3 反转链表 3.4 两两交换链表中的节点 3.5 Pow&#xff08;x&#xff0c;n&#xff09;&#xff08;快速幂)…

DAC测试实验——FPGA学习笔记7

一、DAC简介 DAC全称Digital to Analog Converter&#xff0c;即数模转换器。它用于将主控芯片产生的数字值(0和1)转换为模拟值(电压值)。 1、DAC参数指标 2、DAC类型 常用的DAC可大致分为权电阻网络DAC、T型电阻网络DAC、倒T型电阻网络DAC以及权电流型DAC。 3、AD9708/3PD9…

【stm32-新建工程-寄存器版本】

stm32-新建工程-寄存器版本 ■ 下载相关STM32Cube官方固件包&#xff08;F1&#xff0c;F4&#xff0c;F7&#xff0c;H7&#xff09;■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框&#xff…

智能座舱中的HUD介绍

HUD&#xff08;Head Up Display&#xff0c;抬头显示系统&#xff09;是将车速、油耗、胎压等行车重要信息投影到前方挡风玻璃上的一套显示系统。HUD 最早应用在战斗机上&#xff0c;旨在降低飞行员低头查看仪表的频率&#xff0c;使得飞行员能在保证正常驾驶的同时&#xff0…

# 消息中间件 RocketMQ 高级功能和源码分析(七)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;七&#xff09; 一、 消息中间件 RocketMQ 源码分析&#xff1a;消息存储核心类介绍 1、消息存储在 store 模块中。消息存储核心类 DefaultMessageStore.java 2、消息存储核心类介绍 private final MessageStoreConfig me…