漫谈:C语言 C++ 迷惑的语句、分号、大括号

2023-09-21 09:00:54

        C语言设计得很麻拐。

        初学者经常面临这样的麻烦:

  • 多了一个分号,if条件没通过却执行了
  • 少了一个分号,编译不下去,报奇怪的错误
if(a>0);
    ++x;

        这个代码的“++x”无论如何都会被执行,旁观者很快就能看出来是因为if语句后面多了一个分号。

struct A
{
   int a;
}

        这个代码会导致其后的代码(甚至是另外一个文件,取决于头文件包含顺序)编译出错,错误信息无法理解,焦头烂额中,有经验的程序员马上会去想“是不是哪个类后面少了一个分号?”

        从这两个典型BUG入手,我们来深入研究一下C语言的“语句、分号、大括号”究竟是什么。

        C语言的源代码(.h和.c文件)包含这么几部分内容:注释、预处理指令、编译器指令、语句、函数定义。

        注释我们当然很清楚,不算在代码里面的,没什么结束符要求。

        预处理指令和编译器指令也不是参与编译的代码,以“#”开头,没有结束符要求。

        预处理之后.c文件包含的头文件被展开,形成一个完整的源文件,里面只有要编译的语句和函数定义。为什么特别把“函数定义”单列出来,因为函数定义的结尾是不需要加分号的。

        语句分两种:

  1. 简单语句以分号结束,单独一个分号也是语句(什么都不执行的空语句)。
  2. 复合语句用大括号包裹,大括号后面不需要分号,大括号里面每个简单语句都需要分号。

        语句的其它关键点:

  • 声明、定义都是语句
  • 结构、类的定义也是语句,而且是简单语句,所以大括号后面要加分号
  • if()for(;;)while()这三个的括号里面是表达式、不是语句,所以不能出现大括号
  • if/for/while/do while的执行体是语句,可以是简单语句也可以是复合语句

        例外:

  • 函数定义的大括号后面是不需要分号的,当然有也没关系
  • C++的namespace的大括号后面也不需要分号,因为namespace不是语句

        编程建议:

  • if/for/while/do while执行体必须使用大括号
  • 定义struct/class习惯性先加上分号

(这里是结束)

        

更多推荐

【微信小程序】文章样式,标题样式,及设置背景~

|background-size设置背景图片大小。图片可以保有其原有的尺寸,或者拉伸到新的尺寸,或者在保持其原有比例的同时缩放到元素的可用空间的尺寸。|background-size:cover;适配屏幕大小文章样式,标题样式,及设置背景~index.wxml<viewclass="about"><viewclass=

Fork() 函数:“父” 与 “子” 进程的交互(进程的创建)

阅读导航前言一、fork函数初识1.基本概念2.fork函数返回值二、fork函数的写时拷贝三、总结温馨提示前言前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim、gcc/g++使用、yum工具以及git命令行提

蓝桥杯2023年第十四届省赛真题-更小的数--题解

目录蓝桥杯2023年第十四届省赛真题-更小的数题目描述输入格式输出格式样例输入样例输出提示【思路解析】【代码实现】蓝桥杯2023年第十四届省赛真题-更小的数时间限制:3s内存限制:320MB提交:895解决:303题目描述小蓝有一个长度均为n且仅由数字字符0∼9组成的字符串,下标从0到n−1,你可以将其视作是一个具有n

Go基础语法:变量和常量

2.1变量的声明变量名、常量名、函数名统称为标识符。标识符由字母、数字和下划线组成,只能以字母或下划线开头。Go语言中推荐使用驼峰命名方式。命名方式:stu_name下划线方式;stuName小驼峰方式;StuName大驼峰方式Go语言中的变量必须先声明再使用;非全局变量(函数内的变量)声明之后必须使用,否则报错同一个

典型数据结构-图,图的存储、基本操作和遍历

图引自:《数据结构教程》。概念图可以使得元素之间的关系是多对多。图中任意两个数据元素之间都可能存在连接关系。图作为一种数据结构,可以表达数据元素之间广泛存在着的更为复杂的关系。在众多应用之中,如电子线路分析、工程计划分析、寻找最短路径等等,图是描述这类关系的一个十分自然的模型。有关图论的内容是离散数学的主要内容之一,这

go语言操作数据库

1.10GO连接MySQL因为Go语言没有提供任何官方数据库驱动,所以需要安装第三方函数库。由于在github上安装,所以需要安装git软件,安装过程一直点击下一步即可。安装完成后需要配置环境变量1.10.1安装gitgit软件安装完毕后,配置git的环境变量,这样可以使用get的指令1.10.2安装数据库驱动设置GO

简单几个配置 Go 实现敏感数据脱敏,可以自定义数据脱敏规则(附完整实现源码)

简单几个配置Go实现敏感数据脱敏,可以自定义数据脱敏规则(附完整实现源码)。介绍为了保障企业的数据安全和隐私安全,godlp提供了一系列针对敏感数据的识别和处置方案,其中包含敏感数据识别算法,数据脱敏处理方式,业务自定义的配置选项和海量数据处理能力。godlp能够应用多种隐私合规标准,对原始数据进行分级打标、判断敏感级

pytorch环境配置

pytorch安装与基础pytorch相关配置一:安装cuda1:找到nvidiacontrolpanel2:打开控制面板,找到系统信息中的,组件即可查看到cuda版本,这里我的cuda版本为12.0.1503:下载对应版本的cudatoolkit(我下载的12.0.1)4:安装流程5.验证是否安装成功二:配置cuDN

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类,具备参数管理功能。例如:nn.Linear,nn.Flatten,nn.Dropout,nn.BatchNorm2d,nn.Embeddingnn.Conv2d,nn.AvgPool2d,nn.Con

Go并发可视化解释 – select语句

上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章。Go并发可视化解释—Channel作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partier负责接受顾客的订单,然后将这些订单传递给厨房,Candier和St

go学习-基本知识点

string转[]byte通用的转换会发生内存拷贝,但是如下利用unsafe.Pointer实现的强转则不需要拷贝funcTestDemo(t*testing.T){a:="aaa"b:="bbbbbbb"//ssh是a的内存地址//通过将字符串的底层地址强制转换成StringHead结构来获取字符串的底层指针和长度/

热文推荐