初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
C语言设计得很麻拐。
初学者经常面临这样的麻烦:
- 多了一个分号,if条件没通过却执行了
- 少了一个分号,编译不下去,报奇怪的错误
if(a>0);++x;
这个代码的“++x”无论如何都会被执行,旁观者很快就能看出来是因为if语句后面多了一个分号。
struct A
{int a;
}
这个代码会导致其后的代码(甚至是另外一个文件,取决于头文件包含顺序)编译出错,错误信息无法理解,焦头烂额中,有经验的程序员马上会去想“是不是哪个类后面少了一个分号?”
从这两个典型BUG入手,我们来深入研究一下C语言的“语句、分号、大括号”究竟是什么。
C语言的源代码(.h和.c文件)包含这么几部分内容:注释、预处理指令、编译器指令、语句、函数定义。
注释我们当然很清楚,不算在代码里面的,没什么结束符要求。
预处理指令和编译器指令也不是参与编译的代码,以“#”开头,没有结束符要求。
预处理之后.c文件包含的头文件被展开,形成一个完整的源文件,里面只有要编译的语句和函数定义。为什么特别把“函数定义”单列出来,因为函数定义的结尾是不需要加分号的。
语句分两种:
- 简单语句以分号结束,单独一个分号也是语句(什么都不执行的空语句)。
- 复合语句用大括号包裹,大括号后面不需要分号,大括号里面每个简单语句都需要分号。
语句的其它关键点:
- 声明、定义都是语句
- 结构、类的定义也是语句,而且是简单语句,所以大括号后面要加分号
- if()for(;;)while()这三个的括号里面是表达式、不是语句,所以不能出现大括号
- if/for/while/do while的执行体是语句,可以是简单语句也可以是复合语句
例外:
- 函数定义的大括号后面是不需要分号的,当然有也没关系
- C++的namespace的大括号后面也不需要分号,因为namespace不是语句
编程建议:
- if/for/while/do while执行体必须使用大括号
- 定义struct/class习惯性先加上分号
(这里是结束)