C语言的科学和艺术
The Art and Science of C
第二章 通过例子学习
文章目录
前言
观察一个C语言基础程序hello world的源程序来了解C语言的结构;
理解库作为简化程序设计过程的工具盒的重要性,知道简单库与利用库完成输入输出;
程序组成:输入、计算、输出;
理解程序中变量用于保存数据的作用;
了解数据类型与利用程序算术表达式。
一、"hello world"程序
代码如下:
/*
*File: hello.c
*-------------
*This program prints the message "Hello, world.”
*on the screen. The program is taken from the
*classic C reference text "The C Programming
*Language" by Brian Kernighan and Dennis Ritchie.
*/
//注释
#include <stdio.h>
#include "genlib.h"
//库包含列表
main()
{
printf("hello, world.\n");
}
//主程序
1.1 注释
可读性的保障,对机器无影响,对程序或语句的解释
长注释 /* 程序注释 */ 或单行注释 // 程序注释
1.2 库包含
头文件形式提供库的引用
#include <stdio.h> 标准输入输出库(< >)
#include “genlib.h” 扩展库(或个人库“ ”)
基础功能工具的集合,对库的引用,方便简化程序设计,不用在基础的程序需求上重复造轮子
1.3 主程序
函数 程序步骤的集合
main()
{
}
语句 程序执行步骤
printf(“hello, world.\n”);
函数主体 由所有语句共同构成
调用库函数 printf( ) 声明过函数所在库#include <stdio.h> 后使用函数名即可引用
参数 “hello, world.\n” 字符串 即为 数据: 程序所操作的信息
换行字符 \n 相当于键盘的 Enter 键位
二、两个数的加法程序
代码如下:
/*
*File: add2.c
*-------------
*This program reads in two numbers, adds them together
*and prints their sum.
*/
#include <stdio.h>
#include "genlib.h"
#include "simpio.h"
main()
{
int n1, n2, total;//变量声明
printf("This program adds two numbers.\n");
printf("1st number?");
n1 = GetInteger();
printf("2nd number? ");
n2 = GetInteger();
total = n1 + n2;
printf("The total is %d.\n", total);
}
1.输入
提示消息:程序在screen上显示一个学校的使得用户了解程序需要什么,如下:
printf(“This program adds two numbers.\n”);
printf(“1st number?”);
赋值语句:将等号右边的数值存储于等号左边的变量中;
n1 = GetInteger();//对GetInteger函数的调用,返回用户输入的数值,存储输入的整数信息到变量n1中
2.计算
计算通过表达式来指定数据的必须操作步骤,表达式的结果由赋值语句存储在一个变量中,以便后续操作
total = n1 + n2;
3.输出
printf(“The total is %d.\n”, total);
%d 格式码 作为printf函数中的作用为值的占位符,输出过程中对应的值将被插入到该位置,%d对应数据类型为十进制整数
输出为 The total is _____. ——>The total is total. 即返回total存储的值。
也例如有:
printf(“%d + %d = %d\n”, n1, n2, total);
即输出 对应 n1 + n2 = total,其中各个变量名位置为各自存储的值输出
程序设计的观点
规约论(reductionism):
只有理解一个事物的每个组成部分后才能很好地理解该事物,对程序设计来说是对程序逐句分析,从每个独立部分的层面上理解程序;
整体论(holism):
认为整体并非每一部分的简单叠加,从作为一个整体的层面理解事物,对程序设计来说是从整体考虑功能设计等;
二者在设计程序时都要同时运用,只看整体,则不能理解解决问题的工具;只看细节,则无法对程序实际需求与功能设计有相当的敏感性,明白程序是干什么的。
三、数据类型
如各种数字类型或文字类型从字符到字、句、段等,程序中处理使用输出的各种信息统称为数据(data);
使用数据时,C编译器需要知道其数据类型。
数据类型(data type) 整体上由以下两个性质定义:
1.值的集合,即值域(domain)
2.操作的集合
值域是数据类型的元素的值的集合;操作集由操作该数据类型的值的工具构成;
浮点型数据
包含小数部分的数值称为浮点数(floating-point number),用来近似表示数学中的实数;
float是早期C语言中定义的浮点数类型,现在普遍使用double型,为双精度浮点数,精度是float型的两倍;
double n1, n2, total;//数据声明
n1 = GetReal();//取实数
printf("The total is %g.\n", total);//浮点数对应的格式码
如上代码,变量数据类型的改变点,其中格式码,浮点数有多种格式码,最简单的是用 %g
字符串类型的数据
文本数据的最基本元素是字符,C语言中一般由 ‘ ’ 单引号内单个字符表示,字符组合起来为一个连续单元时为字符串,C语言中一般由 " " 双引号内表示;
以操作和存储数值数据的方法类似来处理字符串,是计算机文本数据处理的重要思想;
string类型 (不用区分是语言定义还是库定义,定义细节不重要,会用就行)
一样的可以变量声明,与输入输出
string name;//数据声明
name = GetLine();//取字符串
printf("My name is %s.\n", name);//字符串对应的格式码
四、表达式
表达式(expression)由项和运算符组成:
项(trem) 表示一个单独的数据值;
项的选择必须是如下之一:
常量 一个明确的数值
变量 数据的存放处,内容可在程序执行期间改变
函数调用
括号中的表达式
运算符(operator) 是一个表示运算的字符或一个字符序列
求值 即执行表达式中每一个特定操作的过程
n1 + n2 //一个表达式
常量
整型常量
浮点型常量 带有小数点,还可以用作科学计数法表示,即用浮点数乘10的整数次幂来表示,如光速近似2.9979x10*8,C语言中写作
2.9979E+8//E代表乘以10的指数次幂
字符串常量 C语言中一般将组成字符串的字符由 " " 双引号括在其内表示;
"hello, world.\n"
变量
变量是一个值的存放处,有三个重要属性:
名称 具有命名规则:
字母或下划线开头,区分字母大小写;
名称字符必须是字母、数字或下划线,不能使用空格和其他特殊符号;
名称不能取用关键字(keyword),关键字都在C语言中有特殊作用;
变量名可以任意长度 ,但C编译器只认为前31个字符有意义;
变量名最好具有可读性,能让人容易明白存储的值是什么
值
类型
赋值语句
变量 = 表达式;
variable = expression;
这里的 = 不是数学意义上的等于,而是赋值操作
运算符和操作数
表达式中实际的运算是由连接各项的运算符表示的,其中最简单的运算符是数学表达式中的运算符,采用的是算数中的标准运算符。适用于所有数字型数据的算术运算符为:
-
+ 加法
-
- 减法(若左边无值则为负号)
-
* 乘法
-
/ 除法
操作数 一般为独立的项,包括次级表达式(子表达式)
运算符作用于一个操作数时为一元运算符,如负号,运算符作用于一对操作数时为二元运算符
整数型和浮点型的结合
C语言中int型数据可以与double型数据随意结合,一个二元运算符两侧都是int型数,则结果为int型数;其中一边或两个都为double型,则结果为double型。
整数除法和求余运算符
- / 除法
整数型的除法运算,结果返回整型,会将余数丢弃,也不会像数学直觉中四舍五入,若想得到数学结果上的正确,则至少一个操作数为浮点数,结果返回也会是浮点数,不会直接丢弃余数 - % 取余
取余符号可以检测一个数是否可以被另一个数整除,若整除返回0,否则返回余数
优先级
优先级法则(rule of precedence) 对算术表达式来说有:
1.C编译器首先执行任何一元的负号运算符
2.C编译器接下来执行乘法运算符(*、/、%),同级和涉及同一操作数则从左执行
3.接下来执行加法运算符(+、-)
此时运算法则符合数学直觉,也有()内优先的执行法则
类型转换
C语言有自动类型转换,隐含在计算过程中,混用数据类型时int转向double;或赋值时,将输入按声明的类型转换,转换中浮点数转向int型时会截尾,直接取整数部分,舍去小数部分
强制类型转换可明确指出转换类型,是一个一元运算符
总结
以上就是今天要讲的内容,本文仅仅简单介绍了两个基础程序引申出的一些问题与思考,部分内容如优先级等还有其他运算符的优先级比较补充,常量,变量存储的形式等,其他内容后续章节会详解。