【C Primer Plus笔记】第二章 C语言概述

第二章主要通过分析一个简单的实例来介绍C语言。

一、程序细节内容

1 #include <stdio.h>

此语句的作用相当于在文件中该行所在的位置键入了文件stdio.h的完整内容。实际上是一种剪切和粘贴操作。

#include语句是C预处理器指令(preprocessor directive)的一个例子。stdio.h文件作为所有C编译包的一部分提供,它包含了有关输入和输出函数的信息供编译器使用。这个名字代表标准输入输出头文件。

最重要的是头文件中包含了建立最终可执行程序时编译器需要用到的信息,如说明函数名以及该函数如何使用。要注意,函数的实际代码被包含在一个预编译代码的库文件中,而不是在头文件中。

头文件是用来指引编译器将程序正确结合在一起的。

最后,#include并不是C语言语句。# 表明这一行是由C预处理器处理的语句。

1 int main(void)

一般情况下,C程序从main()函数开始执行。这里圆括号()表明main()是一个函数。

建议不要使用

1 main()

或者

1 void main()

以上第一种C99标准不允许了,第二种目前没有任何标准考虑接受它。

请坚持使用标准形式,这样程序从一个编译器移到另一个编译器也不会出问题。

二、注释,花括号,程序体和代码块

一般包含在/**/之间的部分是程序注释。有时候也会用 //符号,但是这种注释被限制在一行里。

在编程时,尽量两种注释方法都使用,避免单一的注释风格。

通常,所有的C函数都使用花括号来表示函数的开始和结束。仅有花括号{}能起到这种作用。

三、声明

1 int num;

1.声明在函数中有一个名为num的变量;

2.int说明num是一个整数;

编译器使用这个信息给变量num在内存中分配一个合适的存储空间。

在C语言中,所有变量都必须在使用前定义。声明变量被认为是一个很好的编程技术。

C99遵循C++惯例,允许把声明放在代码块中的任何位置。

变量的命名:可供使用的字符有小写字母、大写字母、数字和下划线(_),第一个字符必须是字母或者下划线。

需要注意,操作系统和C库通常使用一个或者两个下划线开始的名字,所以在编程时,尽量避免这种用法。So,建议第一个字符是字母。

C语言的名字是区分大小写的。

声明变量的好处:

1.将所有变量放在一起,并且赋予变量有意义的名称,会使得程序可读性更高;

2.声明变量会对整个程序的架构有初步的计划;

3.声明变量可以避免程序中发生变量名错误拼写的情况;

4.如果没有声明变量,无法编译C程序。

强烈建议将所有变量声明分组放置在一起。

四、return语句

1 return 0;

在int main(void)中int表示main()函数的返回值应该是个整数。C标准要求main()这样做:带有返回值的C语言函数要使用一个return语句,该语句需要包括关键字return,后面紧跟着要返回的值,然后是分号。

后续读到11章时,再来补充这里的内容。

五、可读性的技巧

1.选择有意义的变量名称;

2.使用注释;

3.使用空行分隔一个函数的该脸上的多个部分;

4.尽量每个语句一行;

六、多个函数

例子如下:

 1 /*即使是简单的例子,也要一个个敲出来*/
 2 /*程序清单2.3*/
 3 #include <stdio.h>
 4 void butler(void)
 5 int main(void)
 6 {
 7      printf("I will summon the butler function.\n");
 8      butler();
 9      printf("Yes.Bring me some tea.\n");
10      return 0;
11 }
12
13 void butler(void)
14 {
15     printf("You rang,sir?\n");
16 }

butler()在程序中出现了三次。

第一次是在原型中,通知编译器要用到的该函数。原型是一种声明方式,用于告诉编译器C程序正在使用一个特殊的函数,指明了函数的属性。

1 void butler(void);

第一个void说明butler()函数不返回值,第二个void表明butler()函数没有参数。

第二次是在main()函数中以函数调用的形式出现。

第三次是在最后给出了函数的定义,即函数本身源代码;

七、调试

语法错误:C的语法错误是将正确的C符号放在了错误的位置。

如何检测程序中的语法错误?

1.编译之前浏览程序的源代码,寻找明显错误;

2.查看由编译器发现的错误。

注意:编译器也会发生错误。某个位置上的一个真正的语法错误可能导致编译器误认为它发现了其他错误,另外,发现错误的位置比真正的错误要滞后一行。

语义错误:在意思上的错误。一般体现在变量名称与实际想要表达的变量不一致。

查找语义错误的方法1:一步一步执行程序并得到结果与实际想要得到的结果进行比较。当然,这个方法比较繁琐,但是却能很好地发现程序中的错误。自然,对于需要迭代10000次的程序......请不要轻易尝试,不过可以选择跟踪其中一部分代码进行分析;

方法2:在程序的关键点出加入打印,用来监视程序运行的情况。

学会如何使用编译器中的调试器是十分重要的。

八、关键字与保留标识符

  • auto/break/case/const/continue/default/do/double/else/enum/extern/float/for/goto/if/inline/int
  • long/register/restrict/return/short/signed/sizeof/static/struct/switch/typedef/union/unsigned/void/volatifle/while/_Bool/_Complex/_Imaginary

九、关键概念

1.编译器是负责完成将所写的程序转化成机器语言的工作;

2.认真写代码,不得懈怠。

另,复习题和编程练习均已OK,在此不表。

时间: 2024-11-06 13:45:35

【C Primer Plus笔记】第二章 C语言概述的相关文章

第二章 c语言概述

一.#include指令和头文件 1.#include C预处理指令,C编译器在编译前对源代码做一些准备工作 2.stdio.h标准输入输出头文件,提供了关于输入输出的信息供编译器使用 头文件包含了建立最终的可执行程序时编译器需要用到的信息,例如:定义常量.说明函数名和函数用法.( 实际的代码被放在一个预编译的库文件里,而不是在头文件里,编译器的链接部分负责找到所需要的库代码.)  即:头文件指引编译器将程序正确组合在一起 二.声明 int num://声明语句 C语言中所有的变量必须在使用之前

C++ Primer 笔记 第二章

C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字符型 8 wchar_t 宽字符型 16 short 短整型 16 int 整型 16 long 长整型 32 float 单精度浮点型 6位有效数字 double 双精度浮点型 10位有效数字 long double 扩展精度浮点型 10位有效数字 2.1.1整型 包括整数字符和布尔型. 字符型:

Java编程思想笔记(第二章)

第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(reference)操作对象 类似遥控器(引用)来操作电视(对象) 在Java中你可以创建一个引用,但是没有与任何对象关联,比如: String s; 这个时候如果用则会报错.安全的做法是: 创建一个引用的同时并进行初始化 String s="1111"; 必须由你创建所有对象 New关键字的意思是给我一

Git帮助文档阅读笔记----第二章-第五节---打标签

本节我们一起来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别. 列显已有的标签 直接运行 git tag 即可: 可以用特定的搜索模式列出符合条件的标签.在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令: $ git tag -l 'v1.4.2.*' v1.4.2.1 v1.4.2.2 v1.4.2.3 v1.4.2.4 新建标签 轻量级的(lightweight) 含附注的(annotated)(建议

《Java并发变成实践》读书笔记---第二章 线程安全性

什么是线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问.从非正式的意义上来说,对象的状态是指存储在状态变量(例如实例或静态域)中的数据."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化.所以编写线程安全的代码更侧重于如何防止在数据上发生不受控的并发访问. 如果当多个线程访问同一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误

Mysql Cookbook学习笔记第二章

1,使用python链接mysql + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # -*- coding: utf-8 -*- # connect.py --连接到MySQL服务器 import sys import MySQLdb try:     conn = MySQLdb.connect(db = "cookbook",                            host = "localhost"

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

第二章 Mablab语言基础

第二章 Mablab语言基础 2.1 Matlab的变量与常量 1) input:x=input(‘please enter a numb’) 2) Inf/inf:正无穷大 3) pi:圆周率 4) 默认保留变量:ans 2.2 Matlab的基本数据结构(1) 1) 修改Curent Folder:修改快捷方式的目标属性 2) 向量=数组 3) 行矩阵a=[1 2 3]或a=[1,2,3];列矩阵b=[1 2 3]'或b=[1;2;3] 4) 内置矩阵函数ones(ones(4):4维全1矩

《Linux Shell脚本攻略》 笔记 第二章:常用命令

<Linux Shell脚本攻略> 笔记 第二章:常用命令 1.cat cat -s //多个空白行压缩成一个 cat *.txt | tr -s '\n'   //移除空白行 cat -n //加行号 2.find 沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. eg: find ./ ! -name "*.txt" -print [[email protected] program_test]# find ./  -type f -name "