>>c语言一个概述
所有语言的起源都是ALGOL语言1960---1969之间提出来的,比如我们是1995年出生的人,那么第一个编程语言出现离我们出生大约就有26年左右。这里我们也要提一下,就是世界上第一个程序员,那么他是谁呢?是一个女人,拜伦的女儿,阿达洛芙莱斯,她创造了第一个算法。
在1972年的时候,Dennis Ritchie在贝尔实验室创造了传统的c语言
1990年美国国家标准局(American National Standards Institate)与iso(国家标准的组织),推出了c89
C99:加入了c++和Java的一些东西,提高了c语言的性能
C语言的主要特点:
第一点;它的运行是非常快的,它仅次于机器语言和汇编语言
第二点;它有丰富的内置函数集和运算符可以用来编写任意的复杂程序
第三点;它融合了汇编语言的性能和高级语言的特性,非常适合编写系统软件和商业软件
第四点;c语言有高度的可移植性
第五点;c语言适合于结构化程序设计
第六点;c语言自我扩展能力是很强的,也就是说,我们可以不断的将自己的函数添加到c函数库里面去。
下面第一个程序hello world:
进入下一个程序:两个数相加
下面进入下一个程序:利息的计算问题
来计算每年年末的一个投资金额,假设利息是11%,用两列显示出年份与相应的金额数目,我们必须知道一个计算公式
年末值=年初资*(1+利息率)
0 50000.00
1 5550.00
2 6160.50
3 6838.15
4 759.035
。。。。
10 14197.11
#define:是一个预处理编译器指令,而不是程序语句,因此,它是不能加上分号结尾的。符号常量通常要大写的一个形式,这样就很容易与小写字母变量区分,符号常量不在声明部分中声明。
进入下面一个程序代码:子例程的使用,直白点说,就是定义一个函数使用
下面进入下一个程序:数学函数的使用
大概输出的形式如下:
Angle Cos(Amgle)
0 1.0000
10 0.9848
20 0.9397
................
180 -1.0000
这里强调一点啊,编程的风格很重要,尽量的让自己的代码清晰易读,适当的加入注释,因为代码不是你自己看,还有别人要来维护你写的代码,对于调试和测试程序很重要
Windows中编译c语言的执行流程:vs2008
编辑源程序——》编译源程序,如果语法错误,就又要重新编辑源程序,如果没错往下走————》与系统库进行链接成可运行的目标代码(obj)———》运行目标代码———》再来判断是逻辑错误还是数据错误,如果数据错误,输入数据,重新走目标代码,如果逻辑错误,就要回到开头了。
如何用控制台cmd来运行c程序:
用文本编辑器编辑一个.c的文件,也就是编辑源程序,然后在打开vs命令提示工具,然后在进入到相应的目录,然后cl 文件名,就会执行编译,链接的工程,然后执行.exe文件就可以了。
在linux操作系统当中:vi 文件名———>gcc 文件名———>./a.out
这里需要我们注意几个问题:
Gcc有几个可配的参数,你可用可不用,但是,在某些情况下,你就必须使用;
-o 用于指定生成可执行文件的名字
-E 只对源文件进行预处理
-c 只对原文件进行预处理后的编译工作,.o文件继续gcc,就会变成一个可执行的文件
-lm 在使用数学函数库的时候,必须加上这个参数,编译源文件
下面我再来说一下,gcc的处理工程:
1.预处理 这个阶段用来处理所有的预处理指令
2.编译 对预处理后的代码进行一个翻译工作,得到计算机识别的一个格式,会产生一个扩展名为.o的目标文件
3.链接 把目标文件和其他一些必要的文件链接成一个可执行的文件,也就是a.out文件
第一章后面的习题做一些讲解说明:
C语言中预处理指令后面是不用加分号的
程序一行只能有一个语句,这样可以增强程序的可读性
在这里,我在来说一下,#include指令吧,在c语言中,很多的函数是保存在c函数库里面的,库函数按种类进行了一个分组,保存在不同的头文件中,如果要访问库中的函数,就要告诉编译器去访问哪个库。
我还得说一下注释问题,多行注释不能包含多行注释,可以包含单行注释
对于int main(){}如果没有return 返回一个整型,是没有问题的,不会报错。但是,如果没有包含头文件#include
突然就发现了一个问题,就是说,在linux操作系统里面,是必须返回return 0的,在winows里面可以不用。
C语言这个东西,是严格区分大小写的。也就是说include与Include是不一样的
问题:为什么使用#define?为什么使用#include?
使用#define就是说定义一个符号常量,当我们在程序里面经常使用到这个常量的时候,方便我们以后进行修改。使用#inlcude就很简单了啊,因为我们需要调用库函数,当我们需要什么库函数的时候,就要调用相应的头文件,才能完成我们的程序。
这里还有一个小知识点main()==int main();
下面是c程序大致结构:
文档部分-》链接部分->定义部分->全局声明部分->main()函数部分->子程序部分
第一章的编程练习去看/home/pxx/c/c_programmer_design/1_programmer_practice
给大家说一下啊,形参可以实一样的,比如上面声明了int a ,int b 的形参,下面也可以你这样来申请.
下面我们来写一个程序,用c来写一个温度转换程序,当输入摄氏度就转换成华式度,当输入的是华式度就转换成摄氏度
下面我们再来写一个程序,就是计算机,进行+ - * / 的运算
计算机里面不能进行支持直接取余的运算。
第一章常量、变量及数据类型和c语言的基础知识
先来讲解一下c语言的转义字符:
\a:响铃 7在linux里面/a就是什么都没有
\b:退格 8将当前位置移到前一列,也就是\b的位置占据前面字符的位置,然后前面的字符就没有了
\n:换行 10
\r:回车 13 将\r后面的字符移到本行的开头
\t:水平制表符
\\:代表反斜线
\’:就代表是单引号
\”:就代表双引号
\0:空字符 0
\ddd:1-3位八进制数代表的字符,这个只能三位用putchar加上单引号来打印
\xhh:1到2位二进制代表的程序,这个只能两位用putchar加上单引号来打印
下面来写一个程序就是转义字符的练习:
注意问题:putcahr只能是单引号,是输入字符时,只能一次输入一个字符,不管是转义字符,还是正常的字符,一次只能加上单引号做一次输出。只有在一种情况下,putchar是不需要加单引号的,那就是用字符的ascii码来打印字符。还有一个问题就是,printf在什么情况下都需要加上双引号来输出字符,并且只能是字符的本身,ascii码和\ddd、\xhh都不可以。
下面我就来说一下,windows里面如何调试一个程序,针对于vs2008来说;
首先,一个程序你要先进行调试才可以看到内存
第一步:下断点,注意一下断点的位置,程序执行到断点的位置会停止,按f5断点会往下走,知道碰到下一个断点。
第二步:点击开始调试
如何看内存:调试->窗口->内存->内存2
断点上面有箭头,说明程序还没有执行这一行
还有一点就是说,变量在计算机里面,是按十六进制存放数据的
常量:常量就是计算机内存里面不可以改变的数据
变量:就是计算机内存里面经常改变的量
在同一个时间,计算机内存空间里面只能保存一个值。这句话,可以这么理解,在同一个时间,也就是,程序的一次运行期间,一个地址所保存的变量,是不会改变的。比如下面这段代码,在一个运行期间,a,b,res的地址,你怎么来打,都是不会变的,除非你重新执行一下这段代码。
Res回得到一个你根本意想不到的值。系统会自动赋上一个初始值,所以变量最好初始化,以免你得到你意想不到的结果
>>变量的内存运行机制
C语言从main函数开始也从main函数结束
Cpu内部运行原理:
1971年11月15日,Intel公司的特德 霍夫发明了世界上第一个未处理器--4004虽然只有45条指令,而且每秒只能执行5万条指令,但他的集成度却很高,它被称为第二次世界大战以来最有影响力的科学家之一
Intel最重要的芯片型号:8086 1978年6月8号 自此进入了X86的时代 这是16位的处理器,寻址空间1M
Intel80386的诞生,Intel正式进入了32位微处理器的时代,寻址空间达到4G
Cpu的根本任务是执行指令,cpu从逻辑上分成3个单元,控制器,运算器,存储器,这三部分有cpu的内部总线连接起来;
控制器:是整个cpu的指挥控制中心,比如像上面的代码,他会先通过控制器找到a的地址,在找到b的地址,热后在运算器里面相加,执行运算
运算器:运算器的全部操作都是由控制器发出的信号来指挥的,所以他是执行部件
存储器:里面包含了cpu片内缓存和寄存器组,是cpu暂时存放数据的地方,里面保存着那些等待处理,或者已经处理了的数据,cpu访问寄存器的时间比访问内存的时间要短,采用寄存器,可以减少cpu的访问次数,从而提高cpu的访问效率
Ok,x现在我们跳过cpu来看问题,变量的定义以及为什么要初始化?
因为比如,你打开了qq,然后退出了,当qq退出,内存里面就会存留一些垃圾数据,当一个新变量占用这段空间,毕竟,你也不会知道,这个新变量会占据的空间是那一段,就比如说,很不巧的是,它刚好把刚刚qq退出那个位置给占了,如果变量没有初始化,他就会默认吧垃圾数据带上,造成你的程序莫名的混乱,c,c++开发,变量必须初始化。