【C语言】深入理解注释

news2024/11/20 8:39:18

文章目录

  • 一. 预处理阶段对注释的处理
  • 二. 注释使用时的注意事项
    • 1. C风格的注释无法嵌套使用
    • 2. 基本注释注意事项
    • 3. 注释导致的二义性
  • 四. 关于注释的一个使用建议

一. 预处理阶段对注释的处理

我们知道一个源文件要变成可执行程序的话,首先要经过预处理,预处理阶段完成的任务包括:头文件展开、宏替换、条件编译、去掉注释。

那具体是怎么去掉注释的呢?下面我们写一段包含注释的代码来测试:

// tes.c
#include <stdio.h>
     
int main()
{
  int /*    */ i = 10;
  // this is a
  // valid comment
  in/*   */t j = 20;
  return 0;
}

下面我们对源文件进行预处理操作:gcc -E test.c -o test.i,生成一个叫做 test.i 的文件,打开文件可以看到预处理后的代码:
在这里插入图片描述

二. 注释使用时的注意事项

1. C风格的注释无法嵌套使用

  • C风格的注释:/* */
  • C++风格的注释://

下面C风格注释的使用是错误的,/**/不能嵌套使用,因为/*总是与离它最近的*/匹配:

#include <stdio.h>

int main()
{
	/*
	/*printf("hello world");
	printf("hello world");*/
	*/
	
	return 0;
}

2. 基本注释注意事项

#include <stdio.h>

int main()
{
	int /* */ i; // 正确
	in/* */t j;  // 报错,因为预处理后注释会被替换成空格
	
	// 正确,此时的//不算作注释
	// 因为它在双引号里面
	// 编译器会优先把它识别为字符串的一部分
	char *s = "abcdefgh //hijklmn"; 
	return 0;
}

3. 注释导致的二义性

下面是测试代码:

#include <stdio.h>

int main()
{
	int x = 10;
	int y = 0;
	int *p = &y;
	y = x/*p;
	return 0;
}

编译后会在这里报错y = x/*p,因为 / 会优先与 * 结合作为一个注释符号。正确的写法应该是在 / 后面加上一个空格或者对 *p 加上一个括号。

// 正确的写法
y = x/ *p;
y = x/(*p);

四. 关于注释的一个使用建议

复杂的函数中,会有很多分支、循环的嵌套,如果它们的行数也有很多的话,我们在阅读的时候容易搞混,不知道哪个循环或分支从哪里开始或者是从哪里结束。

所以建议在分支语句、循环语句结束之后加上注释,这样方便区分各分支或循环体。

在这里插入图片描述

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

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

相关文章

Vtk7.1.1+PCL1.12.0安装

错误可参考&#xff1a;Ubuntu20.04 编译 pcl1.8可能出现的问题 安装参考1&#xff1a;ubuntu20.04下安装pcl_ubuntu安装pcl_Yuannau_jk的博客-CSDN博客 安装参考2&#xff1a;Ubuntu20.04 安装pcl详细教程_ubuntu20.04安装pcl_LYiiiiiii的博客-CSDN博客 安装参考3&#xff1a…

涨知识!你不知道的中国手机号码的编码和划分规则

引言 在当今信息化的时代&#xff0c;移动电话号码已经成为人们日常生活中必不可少的联系方式。中国作为世界上拥有庞大人口数量的国家之一&#xff0c;移动电话号码的编码和划分显得尤为重要。 中国的移动电话号码分为三大运营商&#xff0c;每个运营商又有自己的号码段&…

Spring Security OAuth2.0(三)-----基于Redis存储和JDBC存储

问题 令牌往哪里存&#xff1f; 客户端信息入库 第三方应用优化 1.令牌往哪里存&#xff1f; 在我们配置授权码模式的时候&#xff0c;有两个东西当时存在了内存中&#xff1a; InMemoryAuthorizationCodeServices 这个表授权码存在内存中。InMemoryTokenStore 表示生成的令…

open3D

一、说明 对于点云 处理&#xff0c;这里介绍哦pen3d&#xff0c;该软件和opencv同样是interl公司的产品。 Open3D 是一个开源库&#xff0c;支持快速开发处理 3D 数据的软件。 Open3D 前端在 C 和 Python 中公开了一组精心挑选的数据结构和算法。后端经过高度优化&#xff0c;…

Spring Boot处理CORS跨域请求的三种方法

1 前言 Springboot跨域问题&#xff0c;是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点 跨域只存在于浏览器端&#xff0c;不存在于安卓/ios/Node.js/python/ java等其它环境跨域请求能发出去&#xff0c;服务端能收到请求并正常返回结果&#xff0c;只是结…

05-权限分配 尚筹网

权限控制 权限控制机制的本质就是“用钥匙开锁”。 在实现权限控制之前&#xff0c;这里先完成给Admin分配Role和给Role分配Auth的功能。 一、给Admin分配Role 目标 ​ 通过前端页面操作&#xff0c;将Admin与Role之间的关系保存到数据库 思路 ​ 给下面的按钮&#xff…

【ED合集】事件检测的文章

1 CorED: Incorporating Type-level and Instance-level Correlationsfor Fine-grained Event Detection 论文来源&#xff1a;SIGIR 2022(CCF A类会议) 论文链接&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3477495.3531956 代码链接&#xff1a;GitHub - JiaweiSheng…

抖音小程序|基于天气API实现天气预报功能

文章目录 一、前言包含了功能UI展示 二、开发前的准备三、开发步骤1.app.js 配置2.pages/index.js 演示二维码源码在百度网盘下载 一、前言 参考老版iPhone自带的天气预报APP。目前只有一个界面UI, 后续会更新出更多功能; 包含了功能 - 实况预报 - 未来48小时 - 未来一周的天…

动态gif图片如何在线做?轻松实现图片在线生成gif

常见的jpg、png格式的静态图片想要变成gif格式的动态图片时&#xff0c;要怎么办呢&#xff1f;有没有什么简单实用的gif制作工具呢&#xff1f; 一、什么工具能够在线制作gif&#xff1f; GIF中文网作为一款专业的gif制作&#xff08;https://www.gif.cn/&#xff09;工具&a…

Golang - slice 内部实现原理解析

Golang - slice 内部实现原理解析 一.Go中的数组和slice的关系 1.数组 在几乎所有的计算机语言中&#xff0c;数组的实现都是一段连续的内存空间&#xff0c;Go语言数组的实现也是如此&#xff0c;但是Go语言中的数组和C语言中数组还是有所不同的 C语言数组变量是指向数组第…

鸿蒙Hi3861学习七-Huawei LiteOS(信号量)

一、简介 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中&#xff0c;各任务之间需要同步或互斥实现临界资源的保护&#xff0c;信号量功…

阿里工作7年,肝到P8就靠这份学习笔记了,已助14个朋友拿到offer

​ 在阿里工作了7年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P8也费了不少心思。 技术的更新迭代越来越快&#xff0c;程序员或许是这个过程中最为挣扎的一波人。每…

第0章 学习之前的准备

突然想写点关于linux的东西&#xff0c;一是将自己几十年来零碎的知识作以串联&#xff0c;二是能为正在学习路上的新手作些指引。而恰好作者的孩子是一位初一的学生&#xff0c;我写的这些东西也正是我手把手教授他的&#xff0c;现在分享出来并且命名为《linux中学教程》&…

记一次SpringBoot应用性能调优过程

背景 使用SpringBoot、MyBatis-Plus开发一个接口转发的能&#xff0c;将第三方接口注册到平台中&#xff0c;由平台对外提供统一的地址&#xff0c;平台转发时记录接口的转发日志信息。开发完成后使用Jmeter进行性能测试&#xff0c;使用100个线程、持续压测180秒&#xff0c;…

Java中池化技术探讨

背景&#xff1a;在日常开发中&#xff0c;除了考虑IO操作、线程上下文切换、GC的影响性能外。还通过池化技术提高性能通过循环复用资源&#xff0c;降低资源创建和销毁带来的开销和损失&#xff0c;从而提高性能&#xff0c;例如对象池、内存池、线程池、连接池 一、对象池&a…

软件测试 - 测试用例设计方法之等价类划分和边界值分析

1. 等价类划分法 1.1 基本理论 等价类划分法是通过科学的方法找到具有共同特性的测试输入的集合&#xff0c;避免进行穷举测试&#xff0c;大大减少了测试用例的数量&#xff0c;从而提高测试效率。等价类划分法的典型应用场景就是输入框&#xff0c;适用于较少数量输入框的场…

晶振概述及工作原理

晶振在电路板中随处可见&#xff0c;只要用到处理器的地方就必定有晶振的存在&#xff0c;即使没有外部晶振&#xff0c;芯片内部也有晶振。 晶振概述 晶振一般指晶体振荡器。晶体振荡器是指从一块石英晶体上按一定方位角切下薄片&#xff08;简称为晶片&#xff09;&#xf…

虚拟服务器基础架构解决方案:用最小的工作量实现最大的价值

虚拟服务器基础架构解决方案&#xff1a;用最小的工作量实现最大的价值 一切皆可虚拟化&#xff01;包括服务器在内。NetApp 虚拟服务器基础架构解决方案有助于加快数据访问速度、构建创新服务并简化部署&#xff0c;从而实现最大价值。 为什么选择 NetApp 的虚拟服务器基础架…

pytorch矩阵乘法总结

1. element-wise&#xff08;*&#xff09; 按元素相乘&#xff0c;支持广播&#xff0c;等价于torch.mul() a torch.tensor([[1, 2], [3, 4]]) b torch.tensor([[2, 3], [4, 5]]) c a*b # 等价于torch.mul(a,b) # tensor([[ 2, 6], # [12, 20]]) a * torch.tenso…

详解C++类对象(上篇)——超详细

目录 一&#xff0c;面向对象&面向过程的认识(简单了解即可&#xff0c;逐步认识&#xff09; 二&#xff0c; 类 2.1 类的引入 2.2 类的定义 1. struct 2. class 类的两种定义方式&#xff1a; 2.3 封装&类的访问限定符 1. 封装概念 2. 类的访问限定符 …