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

Ctrl + D是如何与内核文件结束符对应的?如何模拟文件结束符?数字中间为什么不能插入空格或逗号?丰富多彩的语句结束符或分隔符?语句结束符?

目录

Ctrl + D是如何与内核文件结束符对应的?

如何模拟文件结束符?

哪些编程语言支持数值中插入分隔符更容易看清楚?

下划线分隔符

数字中间为什么不能插入空格或逗号?

丰富多彩的语句结束符或分隔符

误用分号

语句结束符

不同语言的结束符

更改语句结束符


Ctrl + D是如何与内核文件结束符对应的?

*nix系统的终端一般会输入Ctrl + D代表输入流结束,Linux和macOS均是如此,尽管Windows用Ctrl + Z,仅仅是外部按键表现,最终目的是一样的。如下以Linux 6.11为例讲解。

  • 每开启一个终端会开启一个terminal设备,以tty为例,对应于内核的tty_struct (include\linux\tty.h).
  • tty默认配置会定义常见控制按键映射关系:
    #define INIT_C_CC { \
    [VINTR] = 'C'-0x40, \
    [VQUIT] = '\\'-0x40, \
    [VERASE] = '\177', \
    [VKILL] = 'U'-0x40, \
    [VEOF] = 'D'-0x40, \
    [VSTART] = 'Q'-0x40, \
    [VSTOP] = 'S'-0x40, \
    [VSUSP] = 'Z'-0x40, \
    [VREPRINT] = 'R'-0x40, \
    [VDISCARD] = 'O'-0x40, \
    [VWERASE] = 'W'-0x40, \
    [VLNEXT] = 'V'-0x40, \
    INIT_C_CC_VDSUSP_EXTRA \
    [VMIN] = 1 }

    上面的VEOF代表文件结束符对应的按键数值是4.
  • 如上INIT_C_CC会被带入kernel tty标准属性设定 tty_io.c (drivers/tty)
    struct ktermios tty_std_termios = { /* for the benefit of tty drivers /
    .c_iflag = ICRNL | IXON,
    .c_oflag = OPOST | ONLCR,
    .c_cflag = B38400 | CS8 | CREAD | HUPCL,
    .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK | ECHOCTL | ECHOKE | IEXTEN,
    .c_cc = INIT_C_CC,
    .c_ispeed = 38400,
    .c_ospeed = 38400,
    / .c_line = N_TTY, */
    };
  • 用户层可通过tcgetattr函数获取对应终端tty (struct termios)的c_cc[VEOF]信息,一般而言默认为0x4, 对应于ASCII EOT (End Of Transmission).
    - 也可用stty -a命令获取当前tty的设定:
    speed 38400 baud; rows 17; columns 198; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?;
  • 综上,Ctrl + D触发按键4,内核根据它注册的EOF传递给上层EOF讯息.

如何模拟文件结束符?

  • *nix系统默认可用Ctrl + D按键可给系统发送EOT信号,对应于stdin的EOF.
    - Windows对应Ctrl + Z.
  • *nix系统可用echo命令发送ASCII码4(EOT)来模拟文件结束。
    echo -e "\004"
    例如,一个程序a.out用getchar读取字符,如下可完成向a.out发送EOF.
    echo -e "\004" | ./a.out
    - 如上还会额外发送'\n'字符,echo -ne "\004"只会发送EOT.

哪些编程语言支持数值中插入分隔符更容易看清楚?

除了C/ObjC不支持,C++/Java/C#/JS/Swift/VB.NET/Rust/Go/Python 3.6/仓颉 等语言均支持,分隔符一般选择是下划线_, 也有选择用单引号。

  • C++:C++14标准引入了对数字字面量中使用单引号'做分隔支持。
    当然,用-std=c++11会出现build错误。
  • C#:从C# 7.0开始,可以使用下划线在数字字面量中增加可读性。
    可通过编译选项/langversion:6.0确认此功能在7.0以上才会支持:error CS8059: 功能“数字分隔符”在 C# 6 中不可用,请使用 7.0 或更高的语言版本。
    C# 7.2开始支持十六进制数值和二进制数值(0x开头和0b开头)在0x和0b后面插入下划线。
  • Java:从Java 7开始,Java支持在数字字面量中使用下划线。
    反向验证,可通过 -target 1.6 -source 1.6选项确认数字字面量存在下划线有编译错误。
  • JavaScript 从 ES2021 版本开始支持在数值字面量中使用下划线作为分隔符。
  • VB.NET之前不支持,VB.NET最新版已经支持数值中用下划线分隔。例如:
    Dim a as Integer = 1_000
  • Rust/Swift/Go语言都支持数值中用下划线分隔。
  • Python 3.6开始也支持数值用下划线分隔,具体参考:PEP 515 – Underscores in Numeric Literals.
  • 仓颉 支持用下划线在数值字面量中,不论是整型还是浮点型。
    例如1_23代表123,1.2_3代表1.23.

下划线分隔符

你可能会困惑,C#也允许数值中有多个连续的下划线,其实本质上,编译器在解析数值字面量直接忽略下划线,所以多个连续下划线不影响解析,例如 1__200.

  • 需要注意,下划线不能在字面量开头或者结尾。

数字中间为什么不能插入空格或逗号?

整数10000不能写成10 000或者10,000, 原因在于为了简化编译器parser字面量的复杂度。一个标准的编译器词法分析器遇到数值类型会不断获取数字并累积,一旦遇到非数字就会退出。如果允许数字中间加空格或者逗号,词法分析器将更复杂,也容易破坏已有语言的结构,产生冲突。当然,一些高级语言为了提升长数值可读性,可以允许数字中间加入一些分隔符:

  • Python (>=3.6版本)可以在数字中间加下划线
    number = 1_000_000
  • Swift可以在整数、浮点数中间加下划线增强可读性
    let number = 1_000_000.000_001

丰富多彩的语句结束符或分隔符

  • C/C++/ObjC/Java/C#/Pascal/PHP 等语言用分号分隔。
  • Basic/Python用换行分隔。
  • SQL语言既可以用换行也可以用分号,在不同语句在同一行时用分号,也支持更改语句分隔符。
  • Swift/JavaScript/Go/仓颉/Kotlin 结束符既可用换行,也可用分号。
    同一行写多个语句,用分号分隔。
  • VB采用换行或者冒号:作为结束符,下划线_作为续行符,VBScript和VB一样。
    • VB 2010之后,行续行符逐渐变得可选,即编译器更加智能,并不是直接以换行作为语句的结束,可以更懂程序员的代码。
    • 同一行有多个语句,用冒号作为语句分隔符。用下划线续行代表上下行属于同一个语句。
  • Rust语句结束符是分号,如果是块语句最后一个语句可以忽略分号。

误用分号

  • C语言分号作为语句的结束,如果误用在if、for和while条件语句之后,可能造成提前结束。
    例如
    if (x == 1);
    printf("is 1");
    这里if判断这行就已经结束了。幸运的是,GCC提供-Wmisleading-indentation选项检测这样的问题。

    if (a < 0)
    return
    printf("fail");
    这里return语句和后面的printf是连在一起作为一个语句。可惜的是,GCC/MSVC打开-Wall也不能提示可能的隐患。
  • C/C++ 结构体定义的最后需要有分号,习惯写C#/Java类定义可能忘记这个设定,造成奇怪的编译结果。比如,忘记了分号,结构体定义被当成了一个类型作为返回值。

语句结束符

这个话题听起来很简单,但不同编程语言的不同语法产生了五花八门的语句结束符。大部分编程语言以换行或者分号作为结束符,当然要排除有续行符的情况。

不同语言的结束符

  • C/C++/Java/C#用分号分隔。
  • Basic/Python用换行分隔。
  • SQL语言既可以用换行也可以用分号,在不同语句在同一行时用分号,也支持更改语句分隔符。
  • Swift/JavaScript/Go语句既可用换行,也可用分号。
  • VB采用换行或者冒号:作为结束符,下划线_作为续行符。VBScript和VB一样。

更改语句结束符

  • MySQL提供DELIMITER修改分隔符的方式,但其他SQL语言未必遵循。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

相关文章:

Ctrl + D是如何与内核文件结束符对应的?如何模拟文件结束符?数字中间为什么不能插入空格或逗号?丰富多彩的语句结束符或分隔符?语句结束符?

目录 Ctrl D是如何与内核文件结束符对应的? 如何模拟文件结束符? 哪些编程语言支持数值中插入分隔符更容易看清楚? 下划线分隔符 数字中间为什么不能插入空格或逗号? 丰富多彩的语句结束符或分隔符 误用分号 语句结束符 不同语言的结束符 更改语句结束符 Ctrl …...

MiM: Mask in Mask Self-SupervisedPre-Training for 3D Medical Image Analysis

Abstract Vision Transformer在3D医学图像分析的自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;中展现了卓越的性能。掩码自编码器&#xff08;Masked Auto-Encoder&#xff0c;MAE&#xff09;用于特征预训练&#xff0c;可以进一步释放ViT在各…...

【STM32 学习笔记】I2C通信协议

注&#xff1a;通信协议的设计背景 3:00~10:13 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广…...

【java】jdk8及以后的时间类总结

目录 1. LocalDate 2. LocalTime 4. ZonedDateTime 5. Duration 6. Period 7. DateTimeFormatter 1. LocalDate 说明&#xff1a;表示不带时区的日期&#xff08;年、月、日&#xff09;&#xff0c;不可变且线程安全。 import java.time.LocalDate;public class Local…...

深入理解 Istio 的工作原理 v1.26.0

解读最新版本的 Istio 源码确实是一项庞大的工程&#xff0c;但我可以为你梳理出一个清晰的脉络&#xff0c;并指出关键模块和代码路径&#xff0c;帮助你深入理解 Istio 的工作原理。 我们主要关注 Istio 的核心组件 Istiod 和数据平面的 Envoy Proxy。 前提&#xff1a; Go…...

深入理解卷积神经网络的输入层:数据的起点与预处理核心

内容摘要 本文围绕卷积神经网络输入层展开&#xff0c;详细介绍其在网络中的重要作用&#xff0c;包括接收不同领域数据的形式及传递数据的过程。深入解读数据预处理的关键操作&#xff0c;如去均值、归一化和PCA/白化。助力读者透彻理解输入层&#xff0c;为构建高效卷积神经…...

redis bitmap数据类型调研

一、bitmap是什么&#xff1f; redis原文&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type . This means that bitmaps can be used with string commands, and most importantly with SET and GET. 翻…...

如何用数学思想填报高考志愿

人一辈子有很多四年&#xff0c;但是很少有哪个四年对你一生的影响能超过大学这四年。 从18岁到22岁的这几年&#xff0c;是一个人真正成年的过程&#xff0c;很多人会在这段时间里认识一生的朋友&#xff0c;谈第一次真正的恋爱&#xff0c;第一次离开父母&#xff0c;自己生…...

LabVIEW 2019 与 NI VISA 20.0 安装及报错处理

在使用 Windows 11 操作系统的电脑上&#xff0c;同时安装了 LabVIEW 2019 32 位和 64 位版本的软件。此前安装的 NI VISA 2024 Q1 版&#xff0c;该版本与 LabVIEW 2019 32 位和 64 位不兼容&#xff0c;之后重新安装了 NI VISA 20.0。从说明书来看&#xff0c;NI VISA 20.0 …...

探索 JWT(JSON Web Token):原理、结构与实践应用对比

目录 前言1. 什么是 JWT&#xff1f;2. JWT 的组成结构详解2.1 Header&#xff08;头部&#xff09;2.2 Payload&#xff08;负载&#xff09;2.3 Signature&#xff08;签名&#xff09; 3. JWT 的实际作用3.1 身份认证3.2 信息传递与授权 4. JWT 与 Cookie、API Key 的比较4.…...

互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-1

互联网大厂Java求职面试&#xff1a;云原生与AI融合下的系统设计挑战-1 在当今云计算和人工智能迅猛发展的背景下&#xff0c;互联网大厂对Java工程师的要求已从传统的单体架构和业务逻辑处理&#xff0c;转向了更复杂的云原生架构设计、AI模型集成以及高并发系统的性能优化能…...

【Redis进阶】持久化

一、MySQL事务特性及Redis持久化需求 &#xff08;一&#xff09;MySQL事务特性 MySQL的事务具有四大核心特性&#xff0c;这些特性对于保证数据库操作的准确性和可靠性至关重要。 ​​原子性​​&#xff1a;事务中的所有操作要么全部成功&#xff0c;要么全部失败&#xf…...

[docker基础一]docker简介

目录 一 消除恐惧 1) 什么是虚拟化&#xff0c;容器化 2)案例 3)为什么需要虚拟化&#xff0c;容器化 二 虚拟化实现方式 1)应用程序执行环境分层 2)虚拟化常见类别 3)常见虚拟化实现 一&#xff09;主机虚拟化(虚拟机)实现 二&#xff09;容器虚拟化实现 一 消除恐…...

Texify - 数学公式OCR转换工具

文章目录 一、项目概览相关资源核心特性 二、安装指南三、使用示例1、命令行转换2、Python API调用3、交互式应用 四、性能基准运行你自己的基准测试 五、局限性 一、项目概览 Texify 是一个OCR模型&#xff0c;可将包含数学公式的图片或PDF转换为Markdown和LaTeX格式&#xf…...

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…...

时钟晶振锁相环pll方向技术要点和大厂题目解析

本专栏预计更新60期左右。当前第9期。 本专栏不仅适用于硬件的笔试面试,同样也适用于梳理硬件核心的知识点。 通过本文能得到什么? 首先,根据实战经验总结时钟晶振,锁相环的主要知识点,技术要点,面试考点; 然后,列出时钟晶振,锁相环的笔试面试的主要题型真题和模拟题,…...

图像处理篇--- HTTP|RTSP|MJPEG视频流格式

文章目录 前言一、MJPEG (Motion JPEG)基本概念技术特点编码方式传输协议数据格式 优势实现简单低延迟兼容性好容错性强 劣势带宽效率低不支持音频缺乏标准控制 典型应用 二、RTSP (Real Time Streaming Protocol)基本概念技术特点协议栈工作流程传输模式 优势专业流媒体支持高…...

【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】

Harbor v2.13.0 详细安装步骤&#xff08;启用 HTTPS&#xff09; 1. 环境准备 系统要求&#xff1a;至少 4GB 内存&#xff0c;100GB 磁盘空间。 已安装组件&#xff1a; Docker&#xff08;版本 ≥ 20.10&#xff09;Docker Compose&#xff08;版本 ≥ v2.0&#xff09; 域…...

C++中的static_cast:类型转换的安全卫士

C中的static_cast&#xff1a;类型转换的安全卫士 在C编程中&#xff0c;类型转换是不可避免的操作&#xff0c;而static_cast作为C四大强制类型转换运算符之一&#xff0c;是最常用且相对安全的一种转换方式。今天我们就来深入探讨一下这个重要的类型转换工具。 一、static_…...

开源与商业:图形化编程工具的博弈与共生

一、开源生态的破局之路&#xff1a;从技术实验到行业标准 在 2025 年全球开发者生态大会上&#xff0c;iVX 凭借 “全栈代码生成 AI 驱动开发” 的技术架构&#xff0c;被行业权威机构评选为 “年度技术创新典范”。作为 2012 年启动的开源项目&#xff0c;iVX 历经 17 年技…...

Docker + Watchtower 实现容器自动更新:高效运维的终极方案

文章目录 前言一、Watchtower 简介二、Watchtower 安装与基本使用1. 快速安装 Watchtower2. 监控特定容器 三、Watchtower 高级配置1. 设置检查间隔2. 配置更新策略3. 清理旧镜像4. 通知设置 四、生产环境最佳实践1. 使用标签控制更新2. 更新前执行健康检查3. 结合CI/CD流水线 …...

(二)Linux下基本指令 2

【知识预告】 16. date 指令 17. cal 指令 18. find 指令 19. which指令 20. whereis 指令 21. alias 指令 22. grep 指令 23. zip/unzip 指令 24. tar 指令 25. bc 指令 26. uname ‒r 指令 27. 重要的⼏个热键 28. 关机 16 date 指令 指定格式显⽰时间&#xff1a;date %Y-…...

1 2 3 4 5顺序插入,形成一个红黑树

红黑树的特性与优点 红黑树是一种自平衡的二叉搜索树&#xff0c;通过额外的颜色标记和平衡性约束&#xff0c;确保树的高度始终保持在 O(log n)。其核心特性如下&#xff1a; 每个节点要么是红色&#xff0c;要么是黑色。根节点和叶子节点&#xff08;NIL节点&#xff09;是…...

无线网络设备中AP和AC是什么?有什么区别?

无线网络设备中AP和AC是什么&#xff1f;有什么区别&#xff1f; 一. 什么是AP&#xff1f;二. 什么是AC&#xff1f;三. AP与AC的关系 前言 肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都…...

Web自动化测试入门详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架…...

WHAT - 简单服务发现

文章目录 简单理解举个例子简单服务发现方式1. 静态配置&#xff08;最简单&#xff0c;但不灵活&#xff09;2. DNS 发现3. 使用服务注册中心&#xff08;稍高级&#xff09; 总结 “简单服务发现”&#xff08;Simple Service Discovery&#xff09;通常指的是一种让系统中的…...

uniapp+vue3+firstUI时间轴 提现进度样式

展示 说明&#xff1a;“status”: 0, //状态:0待审核,1审核通过,2审核驳回,3提现成功,4提现失败 第一种&#xff1a;5种类型归纳为三种显示样式 <fui-timeaxis background"#fff" :padding"[10rpx,16rpx,0]"><!-- 动态生成步骤节点 --><f…...

【日撸 Java 三百行】Day 10(综合任务 1)

目录 Day 10&#xff1a;综合任务 1 一、题目分析 1. 数据结构 2. 相关函数基本知识 二、模块介绍 1. 初始化与成绩矩阵的构建 2. 创建总成绩数组 3. 寻找成绩极值 三、代码与测试 小结 拓展&#xff1a;关于求极值的相关算法 Day 10&#xff1a;综合任务 1 Task&…...

VR 南锣鼓巷:古老街区的数字化绘卷与沉浸式遨游​

VR 技术&#xff0c;即虚拟现实技术&#xff0c;是一种能够创建和体验虚拟世界的计算机仿真系统。它利用计算机生成一种模拟环境&#xff0c;通过多源信息融合的交互式三维动态视景和实体行为的系统仿真&#xff0c;使用户沉浸到该环境中&#xff0c;产生身临其境的感受 。简单…...

使用Java NIO 实现一个socket通信框架

使用Java NIO(非阻塞I/O)实现一个Socket通信框架,可以让你构建高性能的网络应用。NIO提供了Channel、Buffer和Selector等核心组件,支持非阻塞模式下的网络编程。下面是一个简单的例子,展示了如何使用Java NIO创建一个基本的服务器端和客户端进行Socket通信。 1.服务器端 …...