C Primer Plus 的相关笔记第二章: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;
}
}

这是一个简单的程序,程序由一个或多个函数组成,必须有main()函数,函数由函数头和函数体组成。

函数头

函数头包括函数名(如“printf()”,后面的圆括号表明“printf是一个函数名”)、传入该函数的信息类型和函数的返回类型

#include指令和头文件

#include这一行代码是一条C预处理指令(C编译器在编译前对源代码做一些准备工作)比如所有C编译器软件包提供的stdio.h文件(含义是标准输出头文件)

main函数

int main(void)中:int是main()函数的返回给操作系统的是整数类型
函数名后面的圆括号中包含一些传入函数的信息,本例中没有传递任何信息,所以是void

C程序一定从main()函数开始执行(目前不必考虑特殊情况)是函数头必不可少的一部分

函数体

花括号{}

一般而言,花括号标记函数体的开始和结束,左{表示函数体开始,右}表示函数体结束,这是规定,不能省略

声明

int num;这一行代码是声明,声明完成两件事:1.在函数中有一个名为num的变量。2.int表明num是一个整数。为变量创建变量名和标识该变量中储存的数据类型

int是C语言一个关键字(表示一种基本的C语言数据类型,关键字是语言定义的单词,不能做其他用途,例如int不可以做函数名和变量名),num是一个标识符(一个变量、函数或其他实体的名称)
因此,声明把特定的标识符与计算机内存中的特定位置联系起来,在C语言中所有变量必须先声明才能使用

声明中变量的命名规则:可以用小写字母、大写字母、数字和下划线(_)来命名,而且,名称的第一个字符必须是字符或者下划线,不能是数字(命名区分大小写)

printf()函数中

转义序列

如“\n”是一个转义序列,是换行符。每个转义序列都以反斜杠字符()开始,用于代表难以表示或无法输入的字符比如:\t代表Tab键,\b代表Backspace退格键

%

提醒程序要在该处打印一个变量,d表明把变量作为十进制数打印

return语句

return 0;由返回值的C函数要有return语句,应在main()函数中保留return语句的好习惯

分号;

大部分C语言的语句都以分号结尾

注释

1./* 这是一条 C 注释。 **/

2./* 这也是一条 C 注释
被分成两行。 */

3./*
也可以这样写注释。
*/

4.// 这种注释只能写成一行。

5.int rigue; // 这种注释也可置于此。(语句后)

前述多个函数的例子

//* 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");
}

此例中butler()是被定义的一个新的函数,但是main()依旧是必须的

butler()本身的源代码是最后一个printf()中的字符串。butler()函数在程序中出现了 3 次。

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

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

多条声明的例子

// 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;
}

声明了两个变量:feet,fathoms
程序的第一个printf()中进行了两次替换。双引号后面的第一个变量(feet)替换了双引号中的第一个%d;双引号后面的第2个%d。注意,带输出的变量列于双引号的后面。还要注意,变量之间要用逗号隔开。

代码中的错误类型

语法错误:C语言的语法错误指的是,把有效的C符号放在错误的地方(比如将花括号用圆括号代替,此类错误一般来说可被编译器检测)
语义错误:是指意思上的错误(此类错误并未违反C语言的规则,编译器无法检测语义错误,需要自己找出纠正,比如代码事实上求的是一个值的平方,表示的是却是一个值的立方)

关键字和保留标识符

关键字是C语言的词汇。它们对C而言比较特殊,不能用它们作为标识符(如变量名)
在表 2.2 中所列的 C 语言关键字中,粗体表示的是 C90 标准新增的关键字,斜体表示的 C99 标准新增的关键字,粗斜体表示的是 C11 标准新增的关键字——

C Primer Plus 的相关笔记第二章:C语言概述
C Primer Plus 的相关笔记第二章:C语言概述

习题部分

黄色为教材标准答案,否则为自己的答案

1.12复习题(第一章节)

1.对编程而言,可移植性意味着什么?
完美的可以指程序是,其源代码无需修改就能在不同的计算机系统中成功编译的程序。
2.解释源代码文件、目标代码文件和可执行文件有什么区别?
源代码文件包含程序员使用的任何编程语言编写的代码。目标代码文件包含机器语言代码,它不必是完整的程序代码。可执行文件包含组成可执行程序的完整机器语言代码。
3.编程的 7 个主要步骤是什么?
(1)定义程序目标;(2)设计程序;(3)编写程序;(4)编译程序;(5)运行程序;(6)测试和调试程序;(7)维护和修改程序。
4.编译器的任务是什么?
编译器把源代码(如,用 C 语言编写的代码)翻译成等价的机器语言代码(也叫作目标代码)。
5.链接器的任务是什么?
链接器把编译器翻译好的源代码以及库代码和启动代码组合起来,生成一个可执行程序。

1.13 编程练习

我们尚未要求你编写 C 代码,该练习侧重于编程过程的早期步骤。
1.你刚被 MacroMuscle 有限公司聘用。该公司准备进入欧洲市场,需要一个把英寸单位转换为厘米单位(1 英寸=2.54 厘米)的程序。该程序要提示用户输入英寸值。你的任务是定义程序目标和设计程序(编程过程的第 1 步和第 2 步)。

定义程序目标:程序需要提醒用户输入英寸值,而后计算机进行乘法运算,输出为厘米,并且在屏幕中打印出来。

设计程序:应该用流程图表示出来,但是目前还没有学到相关内容(比如提醒用户输入英寸数值),这里只写出需要注意的地方:1.程序应该包含#include.<stdio.h>以及main(),return 0等必要的部分。2.程序应该提醒用户输入英寸值,如果不符合规范应该重新输入。3.转换过程是乘法运算

2.11复习题(本章)

1.C 语言的基本模块是什么?
它们都叫函数(前述,程序由一个或多个函数组成)
2.什么是语法错误?写出一个英语例子和 C 语言例子。
语法错误违反了组成语句或程序的规则。这是一个有语法错误的英文例子:Me speak English good.。这是一个有语法错误的 C 语言例子:printf"Where are the parentheses?";。
3.什么是语义错误?写出一个英语例子和 C 语言例子。
语义错误是指含义错误。这是一个有语义错误的英文例子:This sentence isexcellent Czech.1。这是一个有语义错误的C语言例子: thrice_n = 3 + n;2 { 。
4.Indiana Sloth 编写了下面的程序,并征求你的意见。请帮助他评定。

include studio.h
int main{void} /* 该程序打印一年有多少周 /* (
 int s
 s := 56;
 print(There are s weeks in a year.);
 return 0;

修改后:

#include <stdio.h>
int main(void) /* this prints the number of weeks in a year */
{
 int s;
 s = 52;
 printf("There are %d weeks in a year.\n", s);
 return 0;
}

第 1 行:以一个#开始;studio.h 应改成 stdio.h;然后用一对尖括号把 stdio.h 括起来。
第 2 行:把{}改成();注释末尾把/改成/。 第 3 行:把(改成{
第 4 行:int s 末尾加上一个分号。
第 5 行没问题。
第 6 行:把:=改成,赋值用=,而不是用:=(这说明 Indiana Sloth 了解 Pascal)。另外,用于赋值
的值 56 也不对,一年有 52 周,不是 56 周。
第 7 行应该是:printf(“There are %d weeks in a year.\n”, s);
第 9 行:原程序中没有第 9 行,应该在该行加上一个右花括号}。

5.假设下面的 4 个例子都是完整程序中的一部分,它们都输出什么结果?
a. printf(“Baa Baa Black Sheep.”);
printf(“Have you any wool?\n”);
b. printf(“Begone!\nO creature of lard!\n”);
c. printf(“What?\nNo/nfish?\n”);
d. int num;
num = 2;
printf("%d + %d = %d", num, num, num + num);
a.Baa Baa Black Sheep.Have you any wool?(注意,Sheep.和 Have 之间没有空格)
b.Begone!
O creature of lard!
c.What?
No/nfish?(注意斜杠/和反斜杠\的效果不同,/只是一个普通的字符,原样打印)
d.2 + 2 = 4(注意,每个%d 与列表中的值相对应。还要注意,+的意思是加法,可以在 printf()语句内部计算)

6.在 main、int、function、char、=中,哪些是 C 语言的关键字?
关键字是 int 和 char(main 是一个函数名;function 是函数的意思;=是一个运算符)。
7.如何以下面的格式输出变量 words 和 lines 的值(这里,3020 和 350 代表两个变量的值)?
There were 3020 words and 350 lines.

#include<stdio.h>
int main(void)
{
	int a,b;
	a = 3020 ;
	b = 350;
	
	printf("There were %d words and %d lines.\n",a,b);
	return 0;
}

8.考虑下面的程序:

#include <stdio.h>
int main(void)
{
 int a, b;
 a = 5;
 b = 2; /* 第 7 行 */
 b = a; /* 第 8 行 */
 a = b; /* 第 9 行 */
 printf("%d %d\n", b, a);
 return 0;
}

请问,在执行完第 7、第 8、第 9 行后,程序的状态分别是什么?
执行完第 7 行后,a 是 5,b 是 2。执行完第 8 行后,a 和 b 都是 5。执行完第 9 行后,a 和 b 仍然是 5(注意,a 不会是 2,因为在执行 a = b;时,b 的值已经被改为 5)。

9.考虑下面的程序:

#include <stdio.h>
int main(void)
{
 int x, y;
 x = 10;
 y = 5; /* 第 7 行 */
 y = x + y; /*第 8 行*/
 x = x*y; /*第 9 行*/
 printf("%d %d\n", x, y);
 return 0;
}

请问,在执行完第 7、第 8、第 9 行后,程序的状态分别是什么?
执行完第 7 行后,x 是 10,b 是 5。执行完第 8 行后,x 是 10,y 是 15。执行完第 9 行后,x 是
150,y 是 15。

2.12编程练习

1.编写一个程序,调用一次 printf()函数,把你的姓名打印在一行。再调用一次 printf()函数,把你的姓名分别打印在两行。然后,再调用两次 printf()函数,把你的姓名打印在一行。输出应如下所示(当然要把示例的内容换成你的姓名):
Gustav Mahler 第 1 次打印的内容
Gustav 第 2 次打印的内容
Mahler 仍是第 2 次打印的内容
Gustav Mahler 第 3 次和第 4 次打印的内容

#include<stdio.h>
int main(void)
{
	printf("潘典典\n");
	printf("潘\n典典\n");
	printf("潘");
	printf("典典");
	
	return 0; 
}

2.编写一个程序,打印你的姓名和地址。

#include<stdio.h>
int main(void)
{
	printf("潘典典\n");
	printf("外卖请送到光之国\n");
	
	return 0;
}

3.编写一个程序把你的年龄转换成天数,并显示这两个值。这里不用考虑闰年的问题。

#include<stdio.h>
int main(void)
{
	int age,days;
	age = 20;
	days = age * 365;
	
	printf("I am %d years old and it is %d days\n",age,days);
	return 0;
}

4.编写一个程序,生成以下输出:
For he’s a jolly good fellow!
For he’s a jolly good fellow!
For he’s a jolly good fellow!
Which nobody can deny!
除了 main()函数以外,该程序还要调用两个自定义函数:一个名为 jolly(),用于打印前 3 条消息,调用一次打印一条;另一个函数名为 deny(),打印最后一条消息。

#include<stdio.h>
void jolly(void);
void deny(void);
int main(void)
{
	jolly();
	deny();
	
	return 0;
}
void jolly(void)
{
	printf("For he's a jolly good fellow!\nFor he's a jolly good fellow!\nFor he's a jolly good fellow!\n");
}
void deny(void)
{
	printf("Which nobody can deny!\n");
}

注意函数声明的位置应该在main()函数之前,还有函数声明每一条后面都有分号,不能遗忘
5.编写一个程序,生成以下输出:
Brazil, Russia, India, China
India, China,
Brazil, Russia
除了 main()以外,该程序还要调用两个自定义函数:一个名为 br(),调用一次打印一次“Brazil, Russia”;另一个名为 ic(),调用一次打印一次“India, China”。其他内容在 main()函数中完成。

#include<stdio.h>
void br(void);
void ic(void);
int main(void)
{
	br();
	printf(",");
	ic();
	printf("\n");
	ic();
	printf(",\n");
	br();
	
	return 0;
}
void br(void)
{
	printf("Brazil,Russia");
}
void ic(void)
{
	printf("India,China");
}

6.编写一个程序,创建一个整型变量 toes,并将 toes 设置为 10。程序中还要计算 toes 的两倍和toes 的平方。该程序应打印 3 个值,并分别描述以示区分。

#include<stdio.h>
int main(void)
{
	int toes,a,b;
	
	toes = 10;
	a = toes * 2;
	b = toes * toes;
	printf("toes twice = %d\ntoes squared = %d",a,b);
	
	return 0;
}

7.许多研究表明,微笑益处多多。编写一个程序,生成以下格式的输出:
Smile!Smile!Smile!
Smile!Smile!
Smile!
该程序要定义一个函数,该函数被调用一次打印一次“Smile!”,根据程序的需要使用该函数。

#include<stdio.h>
void br(void);
int main(void)
{
	br();
	br();
	br();
	printf("\n");
	br();
	br();
	printf("\n");
	br();
	
	return 0;
}
void br(void)
{
	printf("Smile!");
}

8.在 C 语言中,函数可以调用另一个函数。编写一个程序,调用一个名为 one_three()的函数。该函数在一行打印单词“one”,再调用第 2 个函数 two(),然后在另一行打印单词“three”。two()
函数在一行显示单词“two”。main()函数在调用 one_three()函数前要打印短语“starting
now:”,并在调用完毕后显示短语“done!”。因此,该程序的输出应如下所示:
starting now:
one
two
three
done!

#include<stdio.h>
void one_three(void);
void two(void);
int main(void)
{
	printf("starting now:\n");
	one_three();
	two();
	printf("three\n");
	printf("done!\n");
	
	return 0;
}
void one_three(void)
{
	printf("one\n");
}
void two(void)
{
	printf("two\n");
}

仅供记录,如有错误,不吝赐教,欢迎批评指正

上一篇:C++学习书籍推荐


下一篇:《C++ Primer》第十一章:关联容器(上)