1. “Hello world”程序
hello.c
程序分为三个部分:程序注释、库包含列表和主程序。如下图所示:
1.1 注释
- 注释(comment)
在C语言中,注释是在“/*”与“*/”之间所有的文字,可以占连续的几行。
1.2 库包含
- 库(library)
是一种工具的集合, 这些工具由其他程序员编写,用于执行特定的功能。
然而要使用一个库,就必须在程序中给出足够的信息,以便编译器知道库里有哪些工具可用。
在大多数情况下,这些信息以头文件(header file)的形式提供。
例如,
#include <stdio.h>
#include "genlib.h"
stdio.h
是一个头文件的名称,定义了标准输入输出库(使用ANSIC时总能获取的标准库,用尖括号标记)的内容。
genlib.h
也是一个头文件的名称,定义了通用库(个人编写的库以及本书所用的扩展库,用引号标明)的内容。
1.3 主程序
hello.c
文件的程序主体:
main()
{
printf("Hello, world.\n")
}
-
函数(function)
是一系列独立的程序步骤,将这些程序步骤集合在一起,并赋予一个名字,就形成了一个函数。 -
语句(statement)
函数所执行的步骤在大括号中列出,这些步骤称为语句。 -
主体(body)
这些语句共同组成函数的主体。
当运行C语言程序时,计算机执行main函数主体中包含的语句,每个完整的C程序中都必须有这个函数。
-
调用(calling) 函数
在程序设计中,通过使用函数名来调用该函数的行为称为调用函数。 -
参数(argument)
是一个函数的调用程序提供给函数的信息。
2. 两个数的加法程序
add2.c
程序要求用户输入两个数字,将其相加并显示总和。如下图所示:
-
变量(variable)
是一些在编写程序时值未知的数据的存放处。
例如,当程序运行时,用户才会输入两个数。为了在程序中引用这些目前尚未确定的数,可创建一个变量来保存这些需要记住的值,并给该变量命名。一旦要用到它包含的值时,可使用其变量名。 -
声明(declaring)
声明一个变量,就是告知C编译器引用了一个新的变量名,并指定了该变量可以保存的数据类型。如:int n1, n2, total;
-
赋值语句(assignment statement)
将等号右边的数值存储于等号左边的变量中。如:n1 = GetInteger();
-
格式码(format code)
%及其后面的字母称为格式码。如:%d。
printf
函数的格式码的作用是作为值的占位符。格式码中的字母用于指定输出格式。
代码实现
/* add two numbers inputted */
#include <stdio.h>
main()
{
int n1, n2, total;
printf("This program adds two numbers.\n");
printf("1st number? ");
scanf("%d", &n1);
printf("2nd number? ");
scanf("%d", &n2);
total = n1 + n2;
printf("Total is %d.\n", total);
}
3. 数据类型
- 数据类型(datatype)
由两个性质定义:值的集合,即值域(domain);操作的集合。
值域就是作为该类型的元素的值的集合;操作集由操作该类型数据的值的工具构成。
代码实现
/* print string inputted */
#include <stdio.h>
main() {
char user[20];
printf("What's your name? ");
scanf("%s", user);
printf("Hello, %s.\n", user);
}
4. 表达式
-
表达式(expression)
由项和运算符组成。 -
项(term)
表示一个单独的数据值(如前文中的n1和n2)。 -
运算符(operator)
是一个表示运算的字符或一个字符序列(如+)。
分为:一元运算符(unary operator),只用于一个操作数;二元运算符(binary operator),适用于一对操作数。
在表达式中,项必须是如下选择之一:
(1) 常量
程序文本中出现的任何明确的数值都称为常量(constant)。
分为:整型常量、浮点型常量、字符串常量。
(2) 变量
变量是数据的存放处,其内容在程序执行期间可以改变。
三个重要属性:名称、值和类型。
(3) 函数调用
值经常通过调用其他函数来产生,这些函数可以是库函数,函数返回数据集给最初的表达式。
(4) 括号中的表达式
在表达式中可以使用括号来表明操作的先后顺序。
-
求值(evaluation)
当程序运行时, 执行表达式中每一个特定操作的过程称为求值。 -
次级表达式(subexpression) / 操作数(operand)
每一个运算符左右两边各连接一个小的表达式,形成一个新的表达式。
这些次级表达式(或称子表达式)称为该运算符的操作数。
操作数常为独立的项,但也可以为更复杂的表达式。
类型转换
(1) 自动类型转换(automatic type conversion)
定义:
该过程隐含在计算过程中,它将一种类型的值转换为另一种兼容的类型。
场景:
a. 数学运算
当用数学运算符对一个整型数和一个浮点数运算时, 整型数在运算执行之前自动转换为对应的double型数。如,对表达式:
1+2.3
在执行加法运算前,计算机内部先将整型数1转换为浮点数1.0。
b. 赋值语句
若声明变量total
为double
类型,赋值语句:
total=0;
作为赋值操作的一部分, 要先将整型数0转换为double类型。
将一个double
型数据赋给一个int
型变量时也会激发这种自动转换, 在转换过程中会舍掉小数部分。
若将变量n
声明为int
型, 赋值语句:
n=1.9999;
得到n=1。
舍去小数部分的操作(此处和整型除法中都会出现),称作截尾(truncation) 。
(2) 强制类型转换(type cast)
定义:
明确指出类型转换。是一个一元运算符,由括在括号内的目的数据类型跟上要转换的数值组成。
场景:赋值语句
如,将分母的数据类型转换为double
型的语句为:
quotient=num/(double) den;
分母为double类型, 则按浮点数来计算除法并保留小数部分。
其中,强制类型转换的优先级高于除法。
代码实现
/* read centimeters inputted and convert it into feets and inches */
#include <stdio.h>
main() {
float cm, totalInches, inch;
int feet;
printf("Length in centimeters? ");
scanf("%f", &cm);
totalInches = cm / 2.54;
// truncation
feet = totalInches / 12;
inch = totalInches - feet * 12;
printf("%.1f cm = %d ft %.1f in\n", cm, feet, inch);
}
参考
《C语言的科学和艺术》 —— 第2章 通过例子学习