《C Primer Plus(第6版)中文版》 第2章 C语言概述

本文是根据《C Primer Plus(第6版)中文版》内容所作笔记,并对标题序号稍加修改。

2.1 示例程序

本章从一简单程序示例开始,讲解C语言中基本的概念。

include <stdio.h>	//预处理器指令
int main(void)		//程序的开始函数
{
     					//函数体的开始
	int num;		//声明变量
	num=1;			//赋值表达式语句

	printf("This is a simple program\n");
	printf("num is %d\n",num);

	return 0;		//跳转语句
}					//函数体的结束

2.2 示例解释

2.2.1 C程序成分

  • 预处理器指令;
  • 函数(基本模块)
  • 语句;

2.2.2 语句类型

  • 标号语句;
  • 复合语句;
  • 表达式语句;
  • 选择语句;
  • 迭代语句;
  • 跳转语句;

2.2.3 #include指令和头文件

#include行代码是预处理指令(preprocessor directive),编译前做预处理(preprocessing)。在程序顶部的信息集合被称为头文件(header)。

头文件包含编译器创建最终可执行程序所用的信息,比如常量、函数等。但是,函数的实际代码在一个预编译代码的库文件(高级语言源代码文件)中,头文件帮助编译器将程序正确地组合在一起。

2.2.4 mian()函数

  • C程序从main()函数开始执行,且main()函数必须是开始函数(程序入口)。
  • main()此形式C90勉强接收,C99和C11不接收。
  • void main()形式被某些编译器允许。
  • 建议使用int main(void)形式。
  • main()提供了程序的基本框架。

void即“空的”而非“无效的”,表示无返回值或无参数。

2.2.5 注释

单行注释

C99新增,为解决多行注释“消失代码”问题

//这是一条注释
//这又是一条注释

多行注释

/*单行注释*/
/*两行
注释*/
/*该行注释无效,没有结束标记

消失代码问题

/*
int x = 200;
/**/

此注释中,第1行开始标记与第3行的结束标记配对,导致第2行代码无法编译。

2.2.6 花括号、函数体和块

{
     
	...
}

花括号将函数的语句括起来,{}内函数的语句和声明称为函数体,也可以用{}把函数中多条语句合并为一个单元或_块_。{}标志函数体的开始和结束。

2.2.7 声明

int num;这行代码叫声明(declaration)。声明完成了两件事:

  • 创建名为num的变量(variable);
  • 表明该变量为整数类型;

以上示例中,int是关键字(keyword)。num是标识符(identifier)。标识符是变量、函数或其他实体的名称。

编译器根据代码信息为变量在内存中分配存储空间。声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了储存在某位置的信息类型和数据类型。C语言中的所有变量必须先声明在使用。

数据类型

第3章详解。

命名规则

  • 使用有意义的标识符;
  • 可以用大小写字母、数字、下划线命名,必须以字母或下划线开头;

声明变量的4个理由

  1. 方便查找变量与理解程序用途,提高可读性。
  2. 方便计划程序。
  3. 有利于发现错误
  4. 使用未声明的变量无法成功编译。

2.2.8 赋值

num = 1;赋值表达式语句,**=**是赋值运算符,执行该语句时,将右侧的值储存在声明时分配的存储空间位置上。

C语言通过赋值运算符而不是赋值表达式语句完成赋值操作。

2.2.9 printf()函数

printf()是C语言的标准函数。()表明printf是函数名,()中的内容是从main()中传递给printf()的信息,即参数

参数

//带实参的printf()函数
printf("This is a simple program\n");
printf("num is %d\n",num);

函数参数分为实际参数形式参数。实际参数是传递给函数的特定值,形式参数是函数中用于存储传入值的变量。

函数调用

输入函数名并将所需的参数填入到()中即可调用函数。程序运行到本行时,控制权交给调用的函数,函数执行结束后,控制权返回给主调函数(calling function),并继续执行后面的语句。函数调用本身是一种表达式,圆括号是运算符,圆括号左边的函数名是运算对象。C11标准中,这中表达式实质上是一种后缀表达式。在表达式末尾加上分号就成了函数表达式语句。

return语句

return 0;是跳转语句。C标准要求main()要有返回值return语句用于返回返回值。如果遗漏该行语句,程序运行到最外侧**}**时会返回0,建议不要省略。第11章详解。

2.3 简单程序的结构

C程序的基本机构即函数,也叫做基本模块。函数的基本结构如下:

函数
函数头
函数体
返回值类型
函数名
参数列表
声明
语句

2.4 提高程序可读性技巧

  1. 使用有意义的标识符名称。
  2. 添加注释。
  3. 使用空行分隔概念上的多个部分。
  4. 每条语句各占一行。

2.5 多函数程序

#include 
void helloworld(void);	//ANSI/ISO C 函数原型
int main(void)			//程序入口
{
     
	helloworld();		//函数调用

	return 0;
}

void helloworld(void)	//函数定义
{
     
	printf("Hello World!");
}

helloworld()出现的三次形式:

  1. 函数原型(prototype),告知编译器在程序中使用该函数。
  2. 函数调用(function call),函数表达式语句,执行函数体部分。
  3. 函数定义(function declaration),包含完整的函数头和函数体,是函数本身的源代码。

函数调用中,若参数表为空,不需写void。

C标准建议为程序中用到的所有函数提供函数原型。标准include文件(包含文件)为标准库函数提供函数原型。

2.6 语法错误与语义错误

语法错误即不遵循C语言的规则。语义错误即遵循C语言规则但是意思上出现的错误。

2.7 程序状态

通过跟踪程序的执行步骤,并记录每个变量,便可监视程序的状态。程序状态(program state)是在程序执行过程中,某给定点上所有变量值的集合。以下有三种检测程序状态的方法:

  1. 人工模拟计算机逐步执行程序。
  2. 在关键点插入额外printf()语句。
  3. 使用调试器(debugger)和断点

调试器是一种可以逐步运行程序并检测变量值的一种程序。

2.8 关键字和保留标识符

关键字是C语言的词汇,不能用作标识符,许多关键字用于指定不同的类型,还有一些用于控制程序中语句执行顺序。下表为C语言的关键字,粗体为C90新增的关键字,斜体表示为C99新增的关键字,粗斜体为C11新增的关键字。

C
auto entern short while
break float signed _Alignas
case for sizeof _Alignof
char goto static _Atomic
const if struct _Bool
continue inline switch _Complex
default int typedef _Generic
do long union _Imaginary
double register unsigned _Noreturn
else restrict void _Static_assert
enum return volatile _Thread_local

如果使用关键字不当,编译器会将其视为语法错误。还有一些保留标识符(reserved identifier),包括以下划线开头的标识符以及标准库函数名。C语言已经指定了它们的用途或保留它们的使用权,如果随便使用会导致问题。

你可能感兴趣的:(C/C++,c语言,编程语言)