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

c++代码各种注释示例详解

1、前言

今天想带大家来了解一下注释,当然,是C语言中的注释,这个大家都并不会感到陌生,但是,当有一天面试官问你?小伙子啊,你能给我讲讲什么是注释吗?大家应该都会懵的吧,毕竟注释有什么可讲的呢?但是事实真的如此吗?今天就由我来带大家了解一下注释吧!

2、正文(危)

1.以代码例子为例

(1)代码段1

首先来几段注释的例子大家来判断下对错(从语法角度和是否实现注释的效果来看)

1

2

3

4

5

6

7

8

9

10

#include <stdio.h>

intmain()

{

int/* */i;

char* s ="abcdefgh //hijklmn";

//Is it a\

valid comment?

in/* */t j;

return0;

}

当大家把这段代码放在vs上去运行的时候,报错的代码只有最后一行代码,即in/* */t j;我们就知道这行代码是有语法错误的,那么其它的代码就完全没有问题了吗?当然,其它的代码没有了语法错误,但是它们的注释效果真正实现了吗?

补充知识:注释被替换是在预处理阶段实现的,注释被替换,本质是替换成空格,上述报错的那一句本质上应该是 in t i;编译器自然会报错,报错是在预处理阶段进行语法检查时出错的,出现了语法错误。

这个是编译器上的标识图,上面的几行代码虽然没有报语法错误,但是有的代码却没有真正实现其注释的效果,下面我们将一行一行的带大家来进行分析!

首先看第一行:int /* */ i;经过替换后。中间的转换为空格,可见并没有语法错误,且能够达到注释的目的。

接下来看第二行代码,这个地方大家可能会感到疑惑了,我命名加了注释符的啊,但是为什么没有达到我想要的效果呢?这个地方的原因是因为//是在字符串中,此时的第一个/被理解成了转义字符,而第二个则真正被理解成了/,至于为什么第二个/没有被理解成转义字符呢?因为第一个/防止了后面的字母被转义,所以后免的一个/才没有被理解成是转义字符,好像扯的有点远了。这个地方需要告诉大家的是在字符串中是无法进行注释的,因为在字符串中的/有特殊的含义!

有的朋友就好奇了,既然C++风格的注释行不通,那么C语言的风格能否行得通呢?答案是不能,下面给大家证明一下吧!

很明显,依旧没有成功行注释,原因同上。

接下来来看第三行代码,我们可以得出一个结论,C++风格的注释是可以续行的!

(2)代码段2

1

2

/*这是*/#/*一条*/define/*合法的*/ID/*预处理*/replacement/*指*/list/*令*/

//这段代码指的就是用replacement list替换ID

当这段代码放到VS上是这样的:

上述两段代码都能编译通过,这说明# 和 define之间可以带空格。(因为注释最终要被空格所代替)

//是C++风格的注释,而/* */则是C语言风格的注释,前者可以一次写多个,不过从第一个//往后就都是注释的内容。

(3)代码段3

1

2

3

4

/*

/*

*/

*/

这段代码在vs中是下面这样的:

注意:/* */不能嵌套注释。/*总是和离它最近的*/进行匹配。

在这段代码中,最终第一行和第三行中的*/进行匹配,剩下最后一个*/没有与之进行配对的。

(4)代码段4

1

2

3

4

5

intx = 10 ;

inty = 10;

intz = 5;

int*p = &z;

y = x/*p;

上面这种代码一定要注意,乍一看没有什么问题,但是接下来我们放到编译器上看一下:

这种代码一定要注意,/*容易被编译器认为是注释,所以会报错。

解决方案有两种:

1.y = x / *p;即在/后面加一个空格,不要让/*连在一起。

2.y = x/(*p);(推荐用第二种)。

2.其它的注释方法

(1)条件编译

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

#include <windows.h>

#define MONEY 1(只有定义了前面的宏,ifdef到endif中间的这段代码才能够正常运行,未定义则跳过)

intmain()

{

#ifdef MONEY

printf("for test1\n");//test1

printf("for test2\n");//test2

#endif

system("pause");

return0;

}

(2)if条件

可以通过if(0)来进行注释,但并不推荐。

http://www.jsqmd.com/news/717897/

相关文章:

  • 如何解析HTTP请求中的完整URL
  • 容器云 Docker 部署实战
  • CANoe+VH6501实战:手把手教你用CAPL精准干扰CAN-FD的Rx报文(附完整Demo)
  • VS Code MCP插件生态从零搭建:7步精准配置+4类典型报错实时修复(附官方未公开的server.json校验清单)
  • 探索C++数组初始化与动态填充
  • 【GD32笔记】:P01 GD32F103C8T6 DWT的使用
  • SOCD Cleaner终极指南:键盘输入冲突解决方案,4种模式提升游戏操作精度
  • 英语副词进阶版
  • SeqGPT-560M从零开始:无需标注数据的中文文本理解模型完整指南
  • 网页视频本地化:VideoDownloadHelper如何重塑你的内容获取体验
  • C++ 智能指针代码解析
  • VS Code MCP生态冷启动避坑图谱:从零搭建可商用MCP服务栈的6个关键决策点(含架构选型矩阵)
  • NEURAL MASK 学术写作助手:自动生成论文中的技术示意图与图表
  • Banana Pi BPI-F4工业级边缘AI开发板解析与应用
  • 提示的错误为Saving Environment to FAT ... Unable to use mmc 0:1... Failed(1)
  • 什么样的人,才算真正的 AI 产品评测专家?
  • 从零开始:HS2-HF_Patch游戏增强补丁完全配置指南
  • QueryWrapper和LambdaQueryWrapper
  • 5步解锁免费VIP音乐体验:MoeKoeMusic跨平台播放器完全指南
  • MedGemma X-Ray 快速入门:小白也能用的医疗影像AI助手
  • TradingView Lightweight Charts:5分钟构建高性能金融图表应用
  • ITSS 项目服务经理:报考条件 + 报考全流程
  • Embedding 学习笔记
  • Si826x数字隔离门驱动器:工业电机控制的高效解决方案
  • Kubernetes攻防 特殊路径挂载导致的容器逃逸
  • 《池上》唐·白居易
  • Linux系统下的深度学习环境配置:从入门到精通
  • 启动mysql失败/usr/libexec/mysqld: Operation not permitted
  • 零基础玩转Qwen2.5-VL-7B:RTX 4090专属视觉助手,开箱即用图文交互
  • Python + FastAPI+ uniapp 健身房预约系统