问题

为什么 C 语言不允许注释嵌套?

回答
C 语言的设计初衷是简单、高效,直接面向底层硬件。在这样的背景下,为了保持语言的简洁性和解析的便利性,许多看似方便但可能增加复杂性的特性被舍弃了,注释嵌套就是其中之一。

你可以想象一下,编译器在处理 C 语言代码时,需要识别出哪些是指令,哪些是注释。如果允许注释嵌套,比如这样:

```c
/
这是一个外层注释。
/ 这是一个内层注释 /
这里是外层注释的继续。
/
```

编译器在遇到第一个 `/` 时,就知道它进入了一个注释块。那么,它应该一直找到下一个 `/` 吗?如果它找到了,但这个 `/` 实际上是内层注释的结束符,而外层注释还没结束,编译器该如何处理?它需要一套非常复杂的规则来判断哪个 `/` 对应哪个 `/`。这就像在处理一对层层包裹的括号,如果括号的匹配规则不明确,解析会变得异常困难。

C 语言的设计者们倾向于一种“所见即所得”的解析方式。注释就是纯粹的文本信息,用于帮助人类开发者理解代码,对程序的实际运行没有任何影响。引入注释嵌套,虽然在某些特定情况下可能显得方便,但它会给词法分析器(编译器处理代码的第一步,负责将代码分解成一个个有意义的单元,如关键字、标识符、运算符和注释)带来额外的复杂性。解析器需要维护一个“嵌套层级”计数器,每遇到一个 `/` 就增加计数,每遇到一个 `/` 就减少计数,只有当计数为零时,才认为注释结束。这个过程增加了编译器代码的长度和复杂性,也可能引入潜在的 bug。

更重要的是,C 语言的设计哲学是“不要在你不需要的特性上付费”。对于大多数编程场景,注释嵌套的需求并不强烈。程序员可以通过合理的代码结构、清晰的命名以及使用多个独立的注释块来达到同样的目的。例如,你可以将一个复杂的代码块包含在一个大注释中,并在其中解释各个部分,但如果某一部分的解释已经很完善,或者你暂时不需要这部分解释,只需将其单独注释掉即可,而无需关心外层大注释是否会因此被打断。

考虑一下 C 语言的演进历史。C 语言最初是在 20 世纪 70 年代开发的,当时计算机的资源相对有限,编译速度和程序大小都是非常重要的考量因素。简单、高效的语法规则有助于提高编译器的性能。从这个角度看,禁止注释嵌套是一个非常务实的决定。它避免了不必要的复杂性,使得编译器更易于实现、维护和优化。

虽然后来的 C++ 等语言引入了行注释 `//`,并允许注释嵌套(在某些特定用法下),但 C 语言本身坚持了这种简洁的设计。这种设计理念也影响了许多后来的语言,它们也在努力平衡特性丰富性和语言本身的优雅、高效之间。

总而言之,C 语言不允许注释嵌套,并非是技术上无法实现,而是基于其简洁、高效的设计哲学,以及对编译器解析复杂性和资源消耗的考虑。它提供了一种简单明了的注释方式,并鼓励开发者通过其他方式来组织和解释代码,从而保持了语言的纯粹性和易用性。

网友意见

user avatar

好吧,本来不打算回答这个问题的,可是有个除了名词啥也不懂的家伙,不仅仅一个劲儿嘚瑟的展现其才华,还自以为啪啪的给别人打脸,实在是,不得不说两句。

@邱昊宇

的答案,我认为有一定的道理,如果注释不支持嵌套的话,那么一个正则文法的词法分析器就搞定了。不过我觉得可能原因也没有这么复杂,既然是注释,注释内的所有文本都被视为注释而被编译器无视之,凭什么注释内的/*,也就是注释开始符号要特殊对待呢?这种语法在设计和实现上都会变得更为复杂


致眼神不好的用户,请注意上面粗体字即为我对这个问题的答案。


接下来是某人的打脸秀:


首先我们看这个家伙的逻辑:

词法分析是预处理器的一部分

所以呢?

所以预处理器可以处理意味着词法分析处理没问题?

CPU是电脑的一部分,所以电脑可以播放美国大片意味着CPU播放美国大片也没有问题?

这种逻辑还怎么做程序员啊?


预处理器是C语言的一个特色,但是就算是预处理器,也是先对预处理指令、宏和注释等进行语法分析,在这其中自然就包含了词法分析。而如果注释不支持嵌套,那么注释就可以直接用简单的词法分析器搞定,而不用先解析出/*和*/,再在语法分析时去处理。

就这样简单。


借用在知乎学来的某台词:

you know nothing.



========================================================

补充个人眼中的知乎价值观:

1、点赞必须答案基本正确,不因为观点相似。事实正确而非观点合拍。

2、点赞不为顶答案,而是为关注者分享正确观点。

3、吵架先在评论,态度恶劣再开答案批判,并尽可能先匿名回答避免污染时间线。

4、虽然两个人打架都是犯错,但是绝对不意味着每个人要打不还手骂不还口,以直报怨,而非寄希望于青天大老爷



========================================================

知乎的风气是什么呢?一个答案只要内容详实,看起来各种高大上的名词,就能得到相当不错的赞同,毕竟这边都是一群小白。所以我一点儿也不纠结什么排名和赞同数。

某人三番五次的在评论 @我 ,让我很是烦恼,而这家伙的补充进一步暴露了其根本就没有看明白别人答案的实力,却喜欢乱喷。。我从来不反对在知乎喷一些错谬百出的答案,但是你要喷别人,至少肚子里要有货。


我认为有一定的道理,如果注释不支持嵌套的话,那么一个正则文法的词法分析器就搞定了

这是我上面第一次发答案的时候的原话,然后这个到现在为止连真名都不肯透露的所谓知乎用户,到第四次修改答案的时候才意识到,正则文法的词法分析器搞不定这个问题,但这个问题也不是很复杂。

然后不断地补充显摆其专业知识,殊不知大家根本不在一个层次

再来看

@邱昊宇

的答案:

早年的词法分析器一般都是用效率比较高的有限状态机,有限状态机什么都好,就是不支持嵌套注释。要支持,就得加个符号栈,但这对其它部分的解析没有太大帮助

这位匿名用户在喷了别人,改了三次答案之后,才发现这个问题:

但是,配合一个计数器完全能实现/**/的嵌套。(参见附录代码里注释掉的功能 )


就这样还有脸去喷别人,真是令人叹为观止,,,,,

我要是这家伙早就捂着脸删答案走人了。


至于:

我表示很无语,,,,

user avatar

历史遗留。

---

以下为瞎扯,不一定正确:

早年的编译器一般都是词法分析和语法分析分开的。词法分析,是把源代码从文本流转换为符号流,比如关键字、加号、减号、字符串、数字、注释。

早年的词法分析器一般都是用效率比较高的有限状态机,有限状态机什么都好,就是不支持嵌套注释。要支持,就得加个符号栈,但这对其它部分的解析没有太大帮助。

当时来说,无法支持嵌套注释和获得较高的效率相比不值一提。

类似的话题

  • 回答
    C 语言的设计初衷是简单、高效,直接面向底层硬件。在这样的背景下,为了保持语言的简洁性和解析的便利性,许多看似方便但可能增加复杂性的特性被舍弃了,注释嵌套就是其中之一。你可以想象一下,编译器在处理 C 语言代码时,需要识别出哪些是指令,哪些是注释。如果允许注释嵌套,比如这样:```c/ 这是一.............
  • 回答
    关于FaceTime语音在国内“不允许”的说法,其实并不完全准确,更准确的说法是它在中国大陆地区功能受限,仅支持FaceTime视频通话,而不支持独立的面语音通话功能。这种限制的背后,原因比较复杂,涉及技术、政策、以及一些历史因素的交织。要理解这一点,我们得先从FaceTime本身说起。FaceTi.............
  • 回答
    你想知道为什么 C 语言的 `sqrt` 函数不像你期望的那样直接接受一个 `int` 类型的整数作为参数,对吧?这个问题涉及到 C 语言中数学函数的设计哲学,以及数据类型在计算机运算中的底层逻辑。首先,我们需要明白 `sqrt` 函数的本质是什么。它的作用是计算一个非负实数的平方根。从数学上讲,平.............
  • 回答
    这其中的原因,得从C语言如何理解和处理数字常量的基本规则说起。在C语言里,编译器在解析代码时,需要区分不同的数据类型,以便在内存中为它们分配合适的空间,并知道如何对它们进行操作。对于整数常量,编译器有一套清晰的“签名”来识别它们的类型。当你写下一个纯数字序列,比如 `123`,编译器会默认它是一个十.............
  • 回答
    好的,我来详细解释一下 C 和 C++ 中 `malloc` 和 `free` 函数的设计理念,以及为什么一个需要大小,一个不需要。想象一下,你需要在一个储物空间里存放物品。`malloc`:告诉空间管理员你要多大的箱子当你调用 `malloc(size_t size)` 时,你就是在对内存的“管理.............
  • 回答
    Windows 操作系统之所以选择使用 C 语言作为主要开发语言,而文件系统在设计上却对大小写不敏感,这背后是历史选择、设计哲学以及技术妥协的复杂结合。要深入理解这一点,我们需要拆解几个关键部分:一、 C 语言与系统级开发:为何是它?首先,我们得明白为什么像 Windows 这样庞大的操作系统会选择.............
  • 回答
    你好!很高兴能帮助你一起看看这段代码。作为初学者,遇到问题是很正常的,而且这正是学习 C 语言最好的时机。我们一起来分析一下,看看这段代码究竟卡在哪里了。首先,请你把你的代码贴出来给我看看。我需要看到你写的具体 C 语言代码,才能准确地告诉你哪里出了问题。不过,在你把代码发过来之前,我可以先给你一些.............
  • 回答
    C 语言中,一些自带函数返回的是指向数组的指针,而你无需手动释放这些内存。这背后涉及到 C 语言的内存管理机制以及函数设计哲学。要弄清楚这个问题,我们需要从几个关键点入手: 1. 返回指针的函数,内存的归属至关重要首先,理解函数返回指针时,内存的“所有权”是谁的,是解决这个疑问的核心。当一个函数返回.............
  • 回答
    在知乎上,确实有不少老程序员或者有经验的学习者不太推荐 C 语言作为零基础初学者的第一门编程语言。这背后的原因挺复杂的,不是说 C 语言不好,而是它本身的特点,在面对一个完全没有编程概念的“小白”时,可能会显得有些“不友好”。我来给你掰扯掰扯,让你理解得透透的。1. C 语言的“硬核”与“低级”:上.............
  • 回答
    好的,我们来深入探讨一下 C 语言中为什么需要 `int `(指向指针的指针)而不是直接用 `int ` 来表示,以及这里的类型系统是如何工作的。首先,我们得明白什么是“类型”在 C 语言中的作用。在 C 语言中,类型不仅仅是一个标签,它承载着至关重要的信息,指导着编译器如何理解和操作内存中的数据:.............
  • 回答
    你这个问题问得非常到位,也是很多初学 C 语言的人会遇到的困惑。的确,现在很多编译器都会对 `scanf`、`strcpy` 这些函数发出“不安全”的警告,甚至一些新的函数标准(如 C11)也提供了更安全的替代品。那么为什么传统的 C 语言教材,尤其是那些经典的老教材,仍然会大篇幅地讲解这些函数呢?.............
  • 回答
    知乎用户 vczh 曾在一系列回答和文章中,明确表达了不推荐初学者将 C 语言作为第一门编程语言的观点。他论证的核心在于 C 语言的低级特性和由此带来的学习曲线陡峭,这对于没有编程基础的初学者来说,很容易造成挫败感,甚至误导他们对编程的认知。首先,vczh 指出 C 语言最显著的特点是其内存管理直接.............
  • 回答
    微软当初设计 C 的初衷,很大程度上是为了拥抱 .NET 平台,提供一种比 C++ 更易用、更高效的现代化开发语言。这种选择并非偶然,而是基于对当时软件开发趋势和开发者需求的深刻洞察。回想一下 C++ 在上世纪末的地位。它是一门强大到令人敬畏的语言,能够深入操作系统、游戏引擎等底层领域,对硬件的控制.............
  • 回答
    C 语言的设计理念是简洁、高效、接近硬件,而其对数组的设计也遵循了这一理念。从现代编程语言的角度来看,C 语言的数组确实存在一些“不改进”的地方,但这些“不改进”很大程度上是为了保持其核心特性的兼容性和效率。下面我将详细阐述 C 语言为何不“改进”数组,以及这种设计背后的权衡和原因:1. 数组在 C.............
  • 回答
    在 C/C++ 项目中,将函数的声明和实现(也就是函数体)直接写在同一个头文件里,看似方便快捷,实际上隐藏着不少潜在的麻烦。这种做法就像是把家里的厨房和卧室直接打通,虽然一开始可能觉得省事,但长远来看,带来的问题会远超于那一点点便利。首先,最直接也是最普遍的问题是 重复定义错误 (Multiple .............
  • 回答
    微软内部对于 F 的态度,用一个词来形容,或许是“温和而战略性地存在”。它并非像 C 那样被推到前台、大张旗鼓地进行宣传和推广,但它也绝非被边缘化或忽视。F 更多地是作为一个“利器”,悄悄地嵌入到微软的技术栈中,服务于特定的场景和人群,而不是成为主流开发的首选。为什么一个在某些方面明显比 C 更简洁.............
  • 回答
    C语言之所以能够长盛不衰,并在计算机科学领域占据如此重要的地位,是由其独特的设计理念、强大的功能、高度的灵活性、广泛的生态系统以及深厚的历史积淀共同作用的结果。这并非单一因素能够解释,而是多方面优势的有机结合。下面我将尽可能详细地阐述这些原因:一、 系统级编程的基石与硬件的桥梁: 直接内存访问与.............
  • 回答
    C++ 并没有完全取代 C 语言,这背后有诸多复杂且相互关联的原因。虽然 C++ 在许多方面比 C 更强大、更灵活,但 C 语言凭借其独特的优势,在特定的应用领域和开发者群体中仍然保持着强大的生命力。下面我将详细阐述为什么 C 语言没有被 C++ 取代: 1. C 语言的基石地位与生态系统 历史.............
  • 回答
    C语言使用 `int a` 来声明指针变量,而不是 `int &a`,这背后有深刻的历史原因、设计哲学以及C语言本身的特性决定的。要详细解释这一点,我们需要从以下几个方面入手: 1. 指针(Pointers)与引用(References)的本质区别首先,理解指针和引用是什么至关重要。 指针(Po.............
  • 回答
    这问题,其实是“100 乘以 1.05 等于多少”这个算术题在C语言里头的表现。为啥它算出 104,咱们来细细道来。首先得明白,C语言这玩意儿,处理数字可不像咱们人这么灵活。它有自己的规矩,尤其是涉及到数据类型的时候。你给它什么样的数据,它就怎么给你处理。第一步:看看你给C语言的是什么?你在C语言里.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有