最近这段时间,用零碎的时间看了一本书《写给大家看的C预言书》(中文版),这本书作者是Greg Perry。我在图书馆无意中看到了这本书,随手翻了翻,感觉写的挺有意思的,一本简约易懂的C语言入门级书籍。看完之后,感觉还是老外的技术书籍写的比较好。“发表时最好的记忆”,于是决定写一下学习总结,以后如果使用的时候,可以随时翻阅。
关于“程序”(program)的定义有很多,这里的解释我觉得通俗简单,即:为了让电脑执行某项具体任务而提供给它的详细指令集合就是程序。运行C语言必须要有C编译器(C compiler),书中推荐的Turbo C++、Borland C++和Visual C++。但是我使用的是Dev-C++,虽然编译器挺简单,当时对于书中提供的示例,完全没有压力。
关于编译器的作用:编译器获取C源代码(source code)并将其翻译成为机器语言(machine language).电脑最终接收的指令必须是二进制(binary)形式。电路的两种状态呗成为二进制状态(binary state).C编译器就是把C程序装换成1和0(表示内部的开或者关)。
(1)一切从main()函数开始
C语言最重要的部分是main()函数(function)。关于函数的定义:C自带的或者编写的执行某些任务的例行程序。每个程序都必须包含main()函数,它是程序能够执行的入口。
1.1
数据类型------------C语言中的数据必须有数字、单词和字符构成。目前最常见的数据时:1,字符;2,整数;3,浮点数(也成实数)。
字符(charactor),是电脑能表示的任意一个字符。电脑能够识别256个不同的字符,每个字符都能够在ASCII表中找到。电脑能够表示的任何东西都能够作为字符。 C 语言中所有的字符数据都括在单引号‘ 中,单引号把字符数据与其他数据区分开。注:1,空格也能产生一个字符 2,’A‘ 'a' '4' '%' 是字符数据, A a 4 %不是字符数据 3,字符数组只能是单个字符,不能再单引号中出现多个字符。例外:’\n‘是少数几个两个字符组合,C语言把它解释成为一个字符。
字符串(string):多个字符的组合是字符组合,使用引号(" ")区分。C语言中并没有字符串的变量,用字符来表示字符串。
数字:没有小数的完整数。注:整数不能够以0开头,否者C语言会认为输入的是16进制或者八进制。(053是一个八进制数,0x45是一个16进制数)
浮点数(float point number):带小数点的数字。 如:543.55、0.0、-14.456、.22
注意:浮点数占用的内存通常是整数的两倍,尽量使用整数,把浮点数留给需要小数的点的值
/*Prints a character and some numbers*/ #include<stdio.h> main() { printf("A letter grede of %c\n",'B'); printf("Read a lot.\n"); printf("Can\tHelp\tYou\n"); printf("Ring my charm\a\n"); printf("I said, \"No Way.\"\n"); printf("\\ means escapse\n"); printf("%d --- %.2f ---- %d \n",24,12.02,33); getchar(); return 0; }
注:getchar();这个函数为了使cmd的屏幕停留,查看屏幕屏幕上的输出信息。
(二) 代码注释
C语言程序从头到尾都应该加上注释(comment)。注释可以方便后续人员对于程序的维护(maintenance)。注释不是C的命令,C语言编译器会过滤掉程序中所有注释,注释是给程序员来看的。关于注释,我觉得还是要言简意赅,简明有效,否者满屏幕的注释将,找程序都困难了。
C语言中注释方式有两种:
1, 用/* 和*/进行注释,如:/* Written by : zhang san ,finished April, 2013*/ ,但是使用这种注释方式,切忌嵌套其他注释;
2,用//来表示单行注释。
注意:1,在程序中加入空白(white space),即在程序中加入空格和空行。可以提高程序的可读性。
/* Writent by : Jet Liu , finished on March 26 , 2013*/ /* Filename : WhiteTest.c */ /* Compute the user the taxes */ #include<stdio.h> main() { float salary ; /* Variables to hold Salary */ float tax ; /* Variable to hold tax */ /* Asks for user salary */ printf("How mach do you make? "); scanf(" %f", &salary); tax = .33 * salary; /*Compute tax*/ printf("You owe %.2f in taxes. ", tax); getchar(); getchar(); return 0; }
(三) 输出 (使用printf())
3.1 关于printf
printf()是把字符、数字和单词发送到屏幕上。
printf()的格式: printf(controlSting [ , data]);
这里的controlSting是必须存在的一般为字符串形式, 而后面的中括号中的data则是可选,一般使用变量替换controlSting中的占位符(placeholder),占位符是提示这个位置要用其他的值来替代。
如: 1, printf("Keep learning.");
2, printf("I am %d", 16)
注:1,每个命令和函数后面都需要分号(;),C语言据此来判断一行是否结束。函数的第一行不需要加分号,如 main()。
2,其实printf()实际上没有吧输出发送到屏幕,而是发送到电脑的标准输出设备(standard output device)。大多数操作系统中包括MS-DOS在内,都将标准输出发送到屏幕。
3.2 转移序列
代码 | 描述 |
\n | 换行 |
\a | 报警 |
\t | 制表符 |
\\ | 反斜杠 |
\* | 引号 |
说明:一个转义字符在C语言中存储为一个字符,并且并不会把字符直接答应在屏幕上,而是会产生描述中的效果,如打印语句出现\n 或者 \a 则会出现换行和电脑铃声响起。
(3) 转化字符
用转化字符(conversion character)来表示数字的格式。 列出常用的转化字符。
转化字符 | 描 述 |
%d | 整数 |
%f | 浮点数 |
%c | 字符 |
%s | 字符串 |
例子:printf("%s %d %.2f %c\n","Sam", 14, -8.55, 'X');
注意:1,C语言不会自动格式化,必须自己使用转化字符
2,不要忘记%f的小数控制,否则C程序会把所有浮点数打印成6个小数位。
/*Prints a character and some numbers*/ #include<stdio.h> main() { printf("%c %s %d %.2f\n", 'Q', "Hello!", 14 , 64.21, 64.21); printf("%c\n", 'Q'); printf("%s\n", "Hello!"); printf("%d\n", 14); printf("%f\n", 64.21); printf("%.2f\n", 64.21); getchar(); return 0; }
结果:
Q Hello! 14 64.21
Q
Hello!
14
64.210000
64.21
(四) 变量
C语言中把数据存储在变量(variable)中。
4.1 变量类型
名称 | 描述 |
char | 存放字符数据,如‘x’和‘*’ |
int | 存放整数数据,存放数据在-32768和23767之间 |
long int | 存放大于237767和小于-32768的整型数据 |
float | 存放浮点数,如0.003,-121.33 |
double | 存放极大和极小的浮点数,float只能存放 从-3.4*10^38 到 3.4*10^38 |
注意:C是少数几种没有字符串变量的一种编程语言
4.2 变量的命名
变量名可以包含1到32个字符,变量名必须以字母开头,后面是字母、数字或下划线的组合。
合法的变量: myData 、 pay94 、 age_limit 、 QtlyIncome
不合法的变量 : 94Pay 、 my age 、 rate*pay
说明: *是特殊符号不能用作变量名中
注意: C语言允许变量名以下划线开头,但是不建议这么做,因为C语言中的一些内置变量以下划线开头,如果自定义下划线开头的变量,可能会与内置函数重名。
4.3 定义变量
变量使用之前必须定义(define)。变量定义(也被成为变量声明,variable declaration)是为了让C语言知道你需要一个变量空间。格式为: 类型 + 变量名 。 例如:int age;
注意: 在函数内部的变量的是局部变量(local variable),在函数之前的变量称之为全部变量(global variable)。
4.4 变量中存储数据
赋值运算符(assignment operator)用来在变量中存放值。复制运算符只是一个等号(=)。
格式: variable = data;
例1: char initial;
initial = 'G'; /*Assigns values to three variables*/
例2:int numSold =25, numBought;
float val = 436.54;
注意:1,不要混淆数据类型和数据变量,避免把一种数据存储到另外一种数据类型的变量中。
2,如果可以,尽量使用局部变量,因为使用局部变量相对来说更加安全。
3,不要在数字中使用都号, 例如 300000, 不要写成30,000。
#include<stdio.h> main() { /*Defines a different variable for each data type*/ char priceCode = 'J'; int quantity = 100; long int wholeSaleQuant = 450000; float price = 13.54; double sales = 9845443.234; return 0; }
(五) 字符串 (使用字符数组)
C语言没有字符串变量,需要向其他的办法来存储字符串数据。
5.1 字符串结束符
C语言中对每一个字符串的末端加上了一个零。
字符串末端的零有以下几个名字:
1,Null零 2,二进制零 3,字符串结束符 4,ASCII零 5,\0
警告:字符串末端用的零既不是普通的数值零也不是字符'0',只有null零出现字符串的末端。在内存中,只有当C程序遇到null零才知道字符串结束了。
5.2 字符串的长度
字符串的长度是指最大的字符数,但不包括null零。计算字符串长度时,null不能算在内。
以下字符串长度都是9:
August 10 和 Batter up
注意:数据中所有单个字符长度都是1. ‘X’和“X”长度都是1,但是“X”占用了两个字符,因为他带有null零。
6.3 字符数组:字符的列表
字符数组(charactor array)在内存中存放字符串。数组是一种特殊的数据类型。
例如: char month[10] = "January"; /*Defines a character array*/
说明:
1,数组中每个单元成为元素(element).打印数组 printf("The month is %s", month);
2,数组初始化有两种方式:1)char month[8] = "January"; 2) char month[] = "January";
6.4 初始化字符串
在没有学习指针之前,如果想对一个数组变量赋值一个新的字符串有两种总方式对字符串进行赋值。
1,给定的字符数组,然后依次一个字符赋值。
2,使用C编译器带的strcpy()函数(字符串赋值)来实现。例如:
strcpy(month, "Apirl");/*Puts new string in month array*/
说明:使用strcpy(),必须增加一个#include <string.h>,;strcpy()会自动在字符串末尾增加null零
注意:
1,只有当字符数组含足够多的元素用于存放字符串时,才能吧字符串放到字符数组中
2,数组下标从0开始。
3,如果字符数组没有为结尾的零预留足够的元素,C语言将不能正确处理字符串。