C语言中的一些小知识点

news/2024/9/20 6:34:07 标签: c语言, 笔记, 开发语言

一、逗号表达式

说明

在C语言中,逗号表达式是一种特殊的表达式,它允许你将多个表达式串联起来,并且会按照从左到右的顺序依次计算每个表达式,但整个表达式的值是最后一个表达式的值。

一般形式如下:

expression1, expression2, expression3, ..., expressionN;

其中,“expression1, expression2, ..., expressionN“是任意数量的表达式,它们将按照顺序被计算。但是,只有最后一个表达式 “expressionN” 的值会被用作整个逗号表达式的值。

例子

#include <stdio.h>

int main() {
    int a = 5, b = 10, c;
    c = (a++, b++, a + b); // 逗号表达式
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    return 0;
}

在这个例子中,逗号表达式 `(a++, b++, a + b)` 计算的顺序如下:

1. “a++”被计算,”a“ 的值增加1,但表达式的值是 `a` 增加前的值,即5。
2. ”b++“ 被计算,“b” 的值增加1,但表达式的值是 ”b“ 增加前的值,即10。
3. “a + b”被计算,此时 `a` 和 `b` 都已增加1,所以表达式的值是6 + 11 = 17。

因此,最终 `c` 的值是17。

二、用强制类型转换将char转换成double可以吗?

例子

#include <stdio.h>

int main() {
    char c = '3'; // 假设我们有一个字符 '3'
    double d;

    // 将字符 '3' 转换为数字 3.0
    d = (double)c - (double)'0';

    printf("The character '%c' as a double is %f\n", c, d);
    return 0;
}

在这个例子中,我们首先定义了一个 char 类型的变量 c 并赋值为 '3'。然后,我们通过强制类型转换将 c 转换为 double 类型,并且减去字符 '0'double 类型值。这是因为在ASCII码表中,数字字符 '0''9' 是连续的,所以 '3' 的ASCII码值减去 '0' 的ASCII码值就得到了数字3。

三、''和'\61'到底哪个是字符常量

(1)在C语言中,字符常量是用单引号(')括起来的单个字符。字符常量在C语言中通常用于表示单个字符,它们在内存中存储为该字符的ASCII码值。以下是一些关于字符常量的要点:

1. **表示方法**:字符常量必须用单引号括起来,例如 `'A'`、`'B'`、`'5'`、`';'` 等。

2. **数据类型**:字符常量在C语言中是 `char` 类型。

3. **ASCII值**:字符常量在内存中存储的是对应的ASCII码值。例如,字符 `'A'` 的ASCII码值是65。

4. **转义序列**:在单引号中,也可以使用特定的转义序列来表示特定的字符,如换行符(`\n`)、制表符(`\t`)、单引号(`\'`)、反斜杠(`\\`)等。

5. **字符字面量与字符串字面量的区别**:字符字面量是单个字符,而字符串字面量是由双引号括起来的字符序列,如 `"Hello"`。

6. **字符常量的范围**:在C语言中,字符常量的范围是从0到255(对于标准ASCII码),这取决于所使用的字符编码。

7. **字符常量的使用**:字符常量可以用于数组、变量赋值、条件判断等。

下面是一个使用字符常量的简单示例:

#include <stdio.h>

int main() {
    char letter = 'A'; // 定义一个字符常量并赋值
    char newline = '\n'; // 定义一个换行符字符常量
    char backslash = '\\'; // 定义一个反斜杠字符常量

    printf("%c%cThis is on a new line.%c", letter, newline, backslash);
    return 0;
}

在这个例子中,我们定义了三个字符常量:`letter` 存储字符 `'A'`,`newline` 存储换行符,`backslash` 存储反斜杠字符。然后我们使用 `printf` 函数打印它们。输出将会是:

A
This is on a new line.\

请注意,由于反斜杠是转义字符,所以在打印时它后面紧跟的字符会被解释为转义序列的一部分,除非它自身被转义(如 `\\` 表示字面量的反斜杠)。

(2)在C语言中,`\61` 是一个八进制的转义序列,它代表ASCII码值为 61 的字符。八进制转义序列以反斜杠(`\`)开始,后跟最多三个八进制数字(0-7)。在这个例子中,`61` 是一个八进制数,它等价于十进制数 97。

因此,`\61` 表示的字符是小写字母 'a',因为 'a' 的ASCII码值是 97。

这里是一个简单的示例,展示如何使用这个转义序列:
 

#include <stdio.h>

int main() {
    char ch = '\61'; // 使用八进制转义序列定义字符 'a'
    printf("The character is: %c\n", ch);
    return 0;
}

当你运行这个程序时,它会输出:

The character is: a

这证明了 `\61` 确实表示小写字母 'a'。

四、判断"abc\045D\\\0";  "0def\081";  "jkl\\\09A8";  "x\nyz\6"; 的长度

下面我们通过用strlen()函数写一段代码,来解决这个问题。

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "abc\045D\\\0";
    char str2[] = "0def\081";
    char str3[] = "jkl\\\09A8";
    char str4[] = "x\nyz\6";

    printf("Length of \"abc\\045D\\\\\\0\" is %lu\n", strlen(str1));
    printf("Length of \"0def\\081\" is %lu\n", strlen(str2));
    printf("Length of \"jkl\\\\\\09A8\" is %lu\n", strlen(str3));
    printf("Length of \"x\\nyz\\6\" is %lu\n", strlen(str4));

    return 0;
}

在C语言中,"abc\045D\\\0";可以分解成下面这些字符'a'、'b'、'c'、'\045'、'D'、'\'、'\0',其中'\0'在计算字符串长度的时候不计算在内。

 在C语言中,"0def\081";可以分解成下面这些字符'0'、'd'、'e'、'f'、'\0',你可能会问为啥不是'\081',在上面的讲解中我们都知道八进制转义序列以反斜杠(`\`)开始,后跟最多三个八进制数字(0-7)。

在C语言中,"jkl\\\09A8"; 可以分解成下面这些字符'j'、'k'、'l'、'\'、'\0'。

在C语言中,"x\nyz\6";可以分解成下面这些字符'x'、'\n'、'y'、'z'、'\6'。

所以以上代码的输出结果是:

Length of "abc\045D\\\0" is 6
Length of "0def\081" is 4
Length of "jkl\\\09A8" is 4
Length of "x\nyz\6" is 5
请按任意键继续. . .

五、有以下程序描述 double a=22;int i=0; a=a++,i++;a的值是多少?

a=a++,i++;和 a=(a++,i++);有区别吗?

下面是a=a++,i++;的程序

#include <stdio.h>

int main() {
    double a = 22;
    int i = 0;

    // 执行逗号表达式
    a = a++, i++;

    // 打印结果
    printf("a = %f\n", a);
    printf("i = %d\n", i);

    return 0;
}

运行结果如下: 

a = 23.000000
i = 1
请按任意键继续. . .

下面是a=(a++,i++);的程序 

#include <stdio.h>

int main() {
    double a = 22;
    int i = 0;

    // 执行逗号表达式
    a = (a++, i++);

    // 打印结果
    printf("a = %f\n", a);
    printf("i = %d\n", i);

    return 0;
}

运行结果如下:  

a = 0.000000
i = 1
请按任意键继续. . .


http://www.niftyadmin.cn/n/5666776.html

相关文章

大文件编辑器(QT)

项目需要做一个大文件编辑器&#xff0c;并对文件中特定的字符串进行高亮显示&#xff0c;尝试过几种方式。这里的大文件是指>几百兆的文件。 一 综述实现方式 方式1 用普通的QTextEdit来分段加载显示文本&#xff0c;当单段文本显示完毕并且继续向下拖动滚动条时&#xf…

从openAI最新模型GPT-o1再谈思维链(Cot)技术,大模型该怎么提升其逻辑推理能力?

“ 推理能力是大模型迈向AGI的必经之路 ” 最近openAI发布了号称史上最强模型——o1,其具有强大的逻辑推理能力,号称能达到人类的博士生水平。 而从o1模型的评测来看,o1模型在数学竞赛,编码,科学问答等方面表现良好,甚至高出了GPT4o一大截。 而且,o1在物理,化学,生…

Vue:加载本地视频

目录 封装视频弹框调用视频组件 封装视频弹框 <template><el-dialog class"videoBox" :title"title" :visible.sync"visible" width"40%" :before-close"handleOnClose" :close-on-click-modal"false" …

用 ReactPHP 实现图片上传加速:让并发上传实现真正的高效

在这个数据爆炸的时代&#xff0c;如何更快、更高效地处理上传任务是每个开发者面临的重要挑战。尤其当我们要上传大量图片时&#xff0c;简单的同步上传方法早已不再满足现代应用的需求。那么问题来了——有没有一种方法能并发上传图片&#xff0c;同时最大限度减少响应时间&a…

Web APIs 第二天

第二天&#xff1a;DOM事件基础&#xff0c;注册事件&#xff0c;tab栏切换 添加事件监听 <body><button>点击</button><script>const btn document.querySelector(button)btn.addEventListener(click, function () {alert(嗲你)})</script> …

电线电缆制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电线电缆制造行业作为关键的基础设施建设领域&#xff0c;正积极拥抱新技术&#xff0c;推动生产方式的深刻变革。电线电缆制造5G智能工厂物联数字孪生平台的兴起&#xff0c;不仅为行业注入了新的活力&#xff0c;更为制造业的数字化转型树立了新的标杆。 电线电缆制造5G智能…

Reactor介绍,如何从简易版本的epoll修改成Reactor模型(demo版本代码+详细介绍)

目录 Reactor demo​​​​​​​ 引入 比喻 修改代码 connection tcp_server ET模式 主逻辑 处理事件 运行结果 代码 完善功能 读取数据 运行结果 ​编辑 代码 处理数据 回指指针 如何处理写事件 引入 循环内 处理对写事件的关心 异常处理 代码 se…

《网络故障处理案例:公司网络突然中断》

网络故障处理案例&#xff1a;公司网络突然中断 一、故障背景 某工作日上午&#xff0c;一家拥有 500 名员工的公司突然出现整个网络中断的情况。员工们无法访问互联网、内部服务器和共享文件&#xff0c;严重影响了工作效率。 二、故障现象 1. 所有员工的电脑…