C primer plus 学习笔记_第二章 C语言概述

第2章 C语言概述

2.1 简单的C程序示例

#include <stdio.h>
int main(void) /* 一个简单的C程序 */
{
int num; /* 定义一个名为num的变量 */
num = 1; /* 为num赋一个值 */
printf("I am a simple "); /* 使用printf()函数 */
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);
return 0;
}

————————————————————————————————————————————————————————————

2.2 示例解释

C程序解剖

2.2.1 第1遍:快速概要

#include<stdio.h> ←包含另一个文件

int main(void) ←函数名

/* 一个简单的C程序 */ ←注释

{ ←函数体开始

int num; ←声明

num = 1; ←赋值表达式语句

printf("I am a simple "); ←调用一个函数

printf(“computer.\n”); ←调用另一个函数

printf(“My favorite number is %d because it is first.\n”, num); ←调用printf()函数把num的值(1)内嵌在用双引号括起来的内容中一并打印。%d告诉计算机以何种形式输出num的值,打印在何处

return 0; ←return语句

} ←结束

2.2.2 第2遍:程序细节

1.#include指令和头文件

C预处理器指令(preprocessor directive)。

通常,在C程序顶部的信息集合被称为头文件(header)。

2.main()函数

C程序一定从main()函数开始执行(目前不必考虑例外的情况)。

int是main()函数的返回类型。

建议:最好写成int main(void)。

3.注释

一共有//和/**/两种形式

//这是一条注释
/*这也是一条注释*/
4.花括号、函数体和块

一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。

花括号还可用于把函数中的多条语句合并为一个单元或块。

5.声明

声明是C语言最重要的特性之一,声明能够定义一个变量的变量名和变量的数据类型。

int是C语言的一个 关键字(keyword),num是一个 标识符(identifier),声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了储存在某位置的信息类型或数据类型。

在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名及其类型。

拓展:
数据类型 :如整数、字符和浮点数。把变量声明为整型或字符类型,计算机才能正确地储存、读取和解释数据。
命名 :可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字符或下划线,不能是数字。
有效和无效的名称
声明变量的4个理由
把所有的变量放在一处,方便读者查找和理解程序的用途;
声明变量会促使你在编写程序之前做一些计划;
声明变量有助于发现隐藏在程序中的小错误,如变量名拼写错误;
如果事先未声明变量,C程序将无法通过编译。

6.赋值

C语言的基本操作之一。

在执行int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值储存在之前预留的位置。
 赋值是C语言中的基本操作之一

7.printf()函数

一种格式化打印函数。

圆括号中的内容是从main()函数传递给printf()函数的信息。该信息为实际参数。在C语言中,实际参数(简称实参)是传递给函数的特定值,形式参数(简称形参)是函数中用于储存值的变量。

带实参的printf()函数
当程序运行到这一行时,控制权被转给已命名的函数,该例中是printf()。函数执行结束后,控制权被返回至主调函数(calling function),该例中是main()。

在例中printf()函数中的%d为占位符,/n是转义序列,是一个换行符。
8.return语句
int main(void)中的int表明main()函数应返回一个整数。C标准要求main()这样做。有返回值的C函数要有return语句。

如果遗漏 main()函数中的 return 语句,程序在运行至最外面的右花括号(})时会返回0。因此,可以省略main()函数末尾的return语句。但是,不要在其他有返回值的函数中漏掉它。

建议:写任何C语言代码时除非有信心,否则最好不要省略return语句。

————————————————————————————————————————————————————————————

2.3 简单程序的结构

程序由一个或多个函数组成,必须有 main()函数。函数由函数头和函数体组成。函数头包括函数名、传入该函数的信息类型和函数的返回类型。通过函数名后的圆括号可识别出函数,圆括号里可能为空,可能有参数。函数体被花括号括起来,由一系列语句、声明组成。最后,main()以return语句结束。
函数包含函数头和函数体
————————————————————————————————————————————————————————————

2.4 提高程序可读性的技巧

1.选择有意义的函数名
2.写注释。
3.在函数中用空行分隔概念上的多个部分。
4.每条语句各占一行。
提高程序的可读性
————————————————————————————————————————————————————————————

2.5 进一步使用C

// fathm_ft.c -- 把2音寻转换成英寸
#include <stdio.h>
int main(void)
{
int feet, fathoms;
fathoms = 2;
feet = 6 * fathoms;
printf("There are %d feet in %d fathoms!\n", feet, fathoms);
printf("Yes, I said %d feet!\n", 6 * fathoms);
return 0;
}

2.5.1 程序说明

程序在开始处有一条注释(使用新的注释风格),给出了文件名和程序的目的。

2.5.2 多条声明

程序在一条声明中声明了两个变量,而不是一个变量。

2.5.3 乘法

查找变量fathoms的值,用6乘以该值,并把计算结果赋给目标变量feet

2.5.4 打印多个值

待输出的变量列于双引号的后面。还要注意,变量之间要用逗号隔开。
待打印的值不一定是变量,只要可求值得出合适类型值的项即可。
————————————————————————————————————————————————————————————

2.6 多个函数

//* two_func.c -- 一个文件中包含两个函数 */
#include <stdio.h>
void butler(void); /* ANSI/ISO C函数原型 */
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void) /* 函数定义开始 */
{
printf("You rang, sir?\n");
}

该程序的输出如下:
I will summon the butler function.
You rang, sir?
Yes.Bring me some tea and writeable DVDs.

butler()函数在程序中出现了3次。第1次是函数原型(prototype),告知编译器在程序中要使用该函数;第 2 次以函数调用(function call)的形式出现在 main()中;最后一次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。

函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明(functiondeclaration)。函数原型还指明了函数的属性。例如,butler()函数原型中的第1个void表明,butler()函数没有返回值(通常,被调函数会向主调函数返回一个值,但是 bulter()函数没有)。第 2 个 void (butler(void)中的 void)的意思是 butler()函数不带参数。因此,当编译器运行至此,会检查butler()是否使用得当。

何时执行 butler()函数取决于它在 main()中被调用的位置,而不是 butler()的定义在文件中的位置。
建议:main()函数放在程序文件开头,其他被定义的函数放在main()函数下面。

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

2.7 调试程序

程序的错误通常叫做 bug,找出并修正错误的过程叫做调试(debug)。

/* nogood.c -- 有错误的程序 */
#include <stdio.h>
int main(void)
(
int n, int n2, int n3;
/* 该程序有多处错误
n = 5;
n2 = n * n;
n3 = n2 * n2;
printf("n = %d, n squared = %d, n cubed = %d\n", n,
n2, n3)
return 0;
)

2.7.1 语法错误

C语言的语法错误指的是,把有效的C符号放在错误的地方。

nogood.c程序中的错误
1.main()函数体使用圆括号来代替花括号;
2.变量声明格式错误;
3.main()中的注释末尾漏掉了*/;
4.printf()语句末尾漏掉了分号。

发现程序语法错误的方法
首先,在编译之前,浏览源代码看是否能发现一些明显的错误。接下来,查看编译器是否发现错误,检查程序的语法错误是它的工作之一。

2.7.2 语义错误

在C语言中,如果遵循了C规则,但是结果不正确,那就是犯了语义错误

编译器无法检测语义错误,因为这类错误并未违反C语言的规则。

发现程序语义错误的方法
1.直接观察;
2.把自己想象成计算机,跟着程序的步骤一步一步地执行,记录变量的变化情况。
跟踪程序的执行步骤

2.7.3 程序状态

程序状态(program state)是在程序的执行过程中,某给定点上所有变量值的集合。它是计算机当前状态的一个快照。

跟踪程序状态的方法:
1.自己模拟计算机逐步执行程序,可以只跟踪一小部分。要忠实代码来进行模拟,不要介入主观判断;
2.在程序中的关键点插入额外的 printf()语句,以监视制定变量值的变化,监视完毕后进行删除;
3.使用调试器。调试器(debugger)是一种程序,让你一步一步运行另一个程序,并检查该程序变量的值。
————————————————————————————————————————————————————————————

2.8 关键字和保留标识符

关键字是C语言的词汇,不能用它们作为标识符(如,变量名)。许多关键字用于指定不同的类型,如 int。还有一些关键字(如,if)用于控制程序中语句的执行顺序。

 ISO C关键字
表中粗体表示的是C90标准新增的关键字,斜体表示的C99标准新增的关键字,粗斜体表示的是C11标准新增的关键字

如果使用关键字不当(如,用关键字作为变量名),编译器会将其视为语法错误。还有一些保留标识符(reserved identifier),C语言已经指定了它们的用途或保留它们的使用权,如果你使用这些标识符来表示其他意思会导致一些问题。保留标识符包括那些以下划线字符开头的标识符和标准库函数名,如printf()。
————————————————————————————————————————————————————————————

2.9 关键概念

可以把程序看作是你希望计算机如何完成任务的描述。编译器负责处理一些细节工作,例如把任务转换成机器语言。必须用编译器能理解的术语(即C语言标准规定的形式规则)表达你的意图。编译器希望接收到特定格式的指令,作为程序员的任务是,在符合 C标准的编译器框架中,表达你希望程序应该如何完成任务的想法。
————————————————————————————————————————————————————————————

2.10 本章小结

C程序由一个或多个C函数组成。每个C程序必须包含一个main()函数,这是C程序要调用的第1个函数。简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。

在C语言中,大部分语句都以分号结尾。声明为变量创建变量名和标识该变量中储存的数据类型。变量名是一种标识符。赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间。函数表达式语句用于调用指定的已命名函数。调用函数执行完毕后,程序会返回到函数调用后面的语句继续执行。

printf()函数用于输出想要表达的内容和变量的值。

一门语言的语法是一套规则,用于管理语言中各有效语句组合在一起的方式。语句的语义是语句要表达的意思。编译器可以检测出语法错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检查程序是否有语义错误要跟踪程序的状态,即程序每执行一步后所有变量的值。

最后,关键字是C语言的词汇。
————————————————————————————————————————————————————————————

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值