(二)通过例子学习

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. 赋值语句

若声明变量totaldouble类型,赋值语句:

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章 通过例子学习

猜你喜欢

转载自blog.csdn.net/m0_38111466/article/details/108653805