小结
可以把程序看作是你希望计算机如何完成任务的描述。编译器负责处理一些细节工作,例如把你要计算机完成的任务转换成底层的机器语言(如果从量化方面来解释编译器所做的工作,它可以把1KB的源文件创建成60KB的可执行文件;即使是个很简单的C程序也要用大量的机器语言来表示)。
由于编译器不具有真正的智能,所以你必须用编译器能理解的术语表达你的意图,这些术语就是C语言标准规定的形式规则(尽管有些约束,但总比直接用机器语言方便得名)。(第一个ANSI/ISO标准:C90。之后还有C99,C11标准)
C程序由一个或多个C函数组成。每个C程序必须包含一个main()函数,这是C程序要调用的第1个函数。简单的函数由函数头和后面的一对花括号组成,花括号中是由声明、语句组成的函数体。
在C语言中,大部分语句都以分号结尾。声明为变量创建变量名和标识该变量中储存的数据类型。变量名是一种标识符。赋值表达式语句把值赋给变量,或者更一般地说,把值赋给存储空间。函数表达式语句用于调用指定的已命名函数。调用函数执行完毕后,程序会返回到函数调用后面的语句继续执行。
printf()函数用于输出想要表达的内容和变量的值
一门语言的语法是一套规则,用于管理语言中各有效语句组合在一起的方式。语句的语义是语句要表达的意思。编译器可以检测出语法错误,但是程序里的语义错误只有在编译完之后才能从程序的行为中表现出来。检查程序是否有语义错误要跟踪程序的状态(使用调试器(debugger)检测程序状态),即程序每执行一步后所有变量的值。
最后,关键字是C语言的词汇。
复习题
1.C语言的基本模块是什么?
函数
2.什么是语法错误?
语法错误违反了组成语句或程序的规则。
3.什么是语义错误?
语义错误是指含义错误。
4.Indiana Sloth编写了下面的程序,并征求你的意见。请帮助他评定
include studio.h
int main{void} /* 该程序打印一年有多少周 /*
(
int s
s := 56;
print(There are s weeks in a year.);
return 0;
//第1行:以一个#开始;studio.h应改成stdio.h;然后用一对尖括号把 stdio.h括起来。
//第2行:把{}改成();注释末尾把/*改成*/
//第3行:把(改成{
//第4行:int s末尾加上一个分号
//第5行:没问题。
//第6行:把:=改成=,赋值用=,而不是用:=。另外,用于赋值的值56也不对,一年有52周,不是56周。
//第7行应该是:printf("There aredweeks inayear.\n",s);
//第9行:原程序中没有第9行,应该在该行加上一个右花括号}。
//修改后的程序如下:
#include <stdio.h>
int main(void) /* 该程序打印一年有多少周 */
{
int s;
s = 52;
print("There are %d weeks in a year.\n",s);
return 0;
}
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!
0 creature of lard!
c. What?C.
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.
printf("There were %d words and %d lines.\n",words, lines);
8.考虑下面的程序,请问,在执行完第7、第8、第9行后,程序的状态分别是什么?
#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行后,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行后,x是10,b是5。
执行完第8行后,x是10,y是15。
执行完第9行后,x是150,y是15。
编程练习
1.编写一个程序,调用一次 printf()函数,把你的姓名打印在一行。再调用一次 printf()函数,把你的姓名分别打印在两行。然后,再调用两次printf()函数,把你的姓名打印在一行。输出应如下所示(当然要把示例的内容换成你的姓名):
#include <stdio.h>
int main(void)
{
printf("Gustav Mahler\n");
printf("Gustav\nMahler\n");
printf("Gustav ");
printf("Mahler\n");
return 0;
}
3.编写一个程序把你的年龄转换成天数,并显示这两个值。这里不用考虑闰年的问题。
#include <stdio.h>
int main(void)
{
int ageyears; /* age in years */
int agedays; /* age in days */
/* large ages may require the long type */
ageyears = 101;
agedays = 365 * ageyears;
printf("An age of %d years is %d days.\n", ageyears, agedays);
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();
jolly();
jolly();
deny();
return 0;
}
void jolly(void)
{
printf("For he's a jolly good fellow!\n");
}
void deny(void)
{
printf("Which nobody can deny!\n");
}
6.编写一个程序,创建一个整型变量toes,并将toes设置为10。程序中还要计算toes的两倍和toes的平方。该程序应打印3个值,并分别描述以示区分。
#include <stdio.h>
int main(void)
{
int toes;
toes = 10;
printf("toes = %d\n", toes);
printf("Twice toes = %d\n", 2 * toes);
printf("toes squared = %d\n", toes * toes);
return 0;
}
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();
printf("done!\n");
return 0;
}
void one_three(void)
{
printf("one\n");
two();
printf("three\n");
}
void two(void)
{
printf("two\n");
}