1.所有的语言都是一个原理,想理解就要明白计算机是如何工作的。
所有的数据在硬件上都是以 1&0两个高低电平来工作的。
程序语言是类似与人类语言,便于人和机器都同的一个媒介。
人通过编写程序语言,然后通过编译器,类似与人类语言的程序转换能电脑硬件能读懂的 1\0来进行工作的。
说白了就是翻译。
c语言编译器怎么玩你在中国说汉语(人类语言),你到非洲不懂非洲语(机器语言1和0)但是有个人懂法语又懂汉语(高级程序语言),非洲有个懂非洲语的又懂法语的(编译器),你用汉语给懂法语的人说(人类语言转变为高级程序语言),懂法语的又给懂非洲语的人说(高级程序语言转变为低级语言),懂非洲语的直接给非洲人说(就变成机器懂的1和0的语言了),这样双方就能沟通了,知道对方想干什么了
2.设计一套计算机能看明白的语言,输入进去一个初始值后,电脑直接算出结果,方便还快,什么内容都行
3.告诉电脑你想做什么,怎么做。然后做给你看
4.编码(人要做的事,也就是人一天到玩说的编程)-译码(把c语言变为机器语言,也就是计算机认识的01代码,所有语言都有的)-连接-CCPU处理计算(具体怎么算的参见计算机基础教材)-得出结果
5.我给你举一个例子。
说一下C语言是怎么执行的。
#include <stdio.h>——这是头文件。
void main() ——主程序
{int a,b; ——定义两个整数。
scanf("%d%d",&a,&b); ——输入两个整数。
printf("%d\n",a+b); ——输入两个整数之和。
}
意思是:输入两个整数,输出它们的和。
输出结果的前后都不允许有空格。
6.假如你是一个杀猪的(够不够通俗?)
C 是一块铁,VB 是一把文武刀,VF 是一把专起肉片的刀
VF 主攻数据库,对基于数据库处理的前后端支持良好,是快速开发数据库软件的利器。其他处理能力欠佳,就好像用起肉片的刀砍骨头。
VB 比较中庸,window 上下层都可承接。文武刀起肉片也可以,不过就....
C 跨平台,底层语言,功能强大,速度快。但,你要砍骨头的话,先要把这块铁打造成骨刀。你要起肉片的话,先要把这块铁打造成起肉片的刀。甚至你要挂猪肉的话,只要把这块铁打造成铁钩子。
此外 3 者的编程语法不一样。
7.你要去某个人的家里,比如张三。你需要知道他家的地址,门牌号。
变量,就相当于张三
指针,就相当于地址,门牌号。
8.指针是什么?初学时是不太好理解的,看多了就领会了。
我就拿钟表(有指针的)做个例子:钟表的指针可以指向任意的是刻度,这里“钟表指针”就相当于我们说的指针,它指向的刻度就相当于我们说的“数据地址"。当看到钟表指针指向某个时刻时,说明钟表指针所指的刻度是几点钟。用C语言中的指针翻译上面的话是:当指
针指向某个数据,说明指针所指的地址的所放的数据是多少。
如:
int i=3,*p;//定义一个整型变量i,i里放的数据3;定义一个指针p
p=&i;//给定义的指针赋值(指针指向了变量i,也就是指向了i所在的地址。)
指针p指向i,说明指针所指的地址所放的数据时3。
“指针所指的地址所放的数据”可以用“&p”表示。
当已经给指针赋值后,本例中,p所指的地址可以用“&i”,也可以用“p”表示。
9.指针就是用来存放地址的。比如int i=3,*p;p=&i;程序在编译时,系统就会给这个变量i 分配2个字节的内存单元,而内存区的每个字节都有一个编号。假如系统把地址编号为2000和2001这两个内存单元分配
给i,则2000和2001中存放的是变量i的值3,指针p中则存放着变量i的起始地址,即2000.就好像你去住酒店,指针就用来存放你的房间号,我只通过这个房间号就可以到你。 10.++是先引用,后加,++i是先加,后引用;
如i=2,执行a=i++;则a的值为2; 如i=2,执行a=++i;则a的值为3;
i++是右值,当成常量对待;++i是左值,当成变量对待。如语句:++i=3; 合法如语句:i++=3; 非法这里我们先讲 i++ 不要记教材上的东西。。始终记得,++在后,比如在赋值过程中 j = i++;那么执行语句的流程是j = i; i = i + 1;也就是说先使用再自加。如果 ++ 在前,那么过程是相反的。那就是先自加再使用。比如 j = ++i;先自加是 i=i+1;再使用 j = i;
10.通俗点说:所谓“精度”可以理解为“精确的程度”。假设单精度用4位数记录一个变量,双精度就是用两个单精度也就是8位来记录一个变量。比如0.11111111,单精度下就只能记录0.1111,双精度就能记录到0.11111111。
单精度和双精度都指浮点数,就是带小数点的数
只不过单精度和双精度是为了区分有效数而已(也就是精确度),它的提法完全符合科学计算中对于数值的观念。
比如:单精度/双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证。
P.S. 在Turbo C中单精度占4个字节(32位)内存空间只能提供七位有效数字, 而双精度占8个字节(64位)内存空间,可提供16位有效数字。
简单点,就是小数点后的位数越多,它就越精确,表示的范围越大!
11.C语言中到底有多少个关键字呢?木有错,ANSI C规定是32个!他们分别是:auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if while static。
别看那一堆了字母了,直接看下面的分类介绍:
第一类:数据类型关键字
这一类别的关键字有:
char //声明字符型变量或函数
double //声明双精度变量或函数
enum //声明枚举类型
float //声明浮点型变量或函数
int //声明整型变量或函数
long //声明长整型变量或函数
short //声明短整型变量或函数
signed //声明有符号类型变量或函数
struct //声明结构体变量或函数
union //声明共用体数据类型
unsigned //声明无符号类型变量或函数
void //声明函数无返回值或无参数,声明无类型指针
这一类别的关键字无需过多的说明,基本都是我们经常用到的,但是,仍然有些是我们需要注意的东西:
C 标准并未定义指针、整数型(int)、长型(long)为特定的位数目。在32位体系结构下,一般int和long都是32位长;值得注意的是,64位机器下,很多程序设计环境,“int”变量仍然是 32 位宽,“long”和指针是 64 位宽。注意,这里说的只是一般情况下!详细的解释可以看这里.(64位)
union声明的联合数据结构,里面的数据是共享内存的,可以看
脑袋一迷糊,人就容易犯二--union题目
今天跟赶场子似的匆匆赶去北邮笔试,题目不是很难,不过满脑子的浆糊,然后就犯了点2~心里很不爽!心态阿心态!
看下面这个题目:
#include <stdio.h>
union{
int i;
char x[2];
}a;
int main(){
a.x[0]=10;
a.x[1]=1;
printf("%d \n", a.i);
}
问题是这个题目最终会打印出什么(小尾端)?
C语言中的union是联合体,里面不同类型的元素共享同一块内存,也就是数组x[2]和整数i共享同一个内存,其中char类型占1个字节,int类型占4个字节。给数组x两个元素赋值,也就是给int类型的底两个字节赋值。
经过简单的思索和运算之后,我开始犯2了!!我的到了一个答案:26
笔试回来后,在电脑上复原代码,结果呢?266!!这是为什么呢?我用GDB跟了一遍,没有想通,怀
疑是64位机器的原因,查看sizeof(char),没错阿,是1。把程序拷贝到32位的机器上,仍然是266。然后又怀疑是union会自动讲char补齐,将结构体中的x[2]改成x[4],还是266!
就在这时,我瞬间觉悟了!经常性的整16进制把我整傻了,居然把4个bit当作了一个字节!!
我算出来的i用二进制表示是:11010,高4位表示x[1],低4位表示x[0],而实际上应该是:100001010!!高8位表示x[1],低8位表示x[0]
居然犯这么傻的错误!哎~迷糊的脑袋--# 谁能给提提意见怎么避免这种大脑的短路呢????
另外,透露个消息,李开复大哥将在10月16号亲自来中科院教学楼为创新工场做宣讲,有兴趣的同学以及开复粉丝可以去看看!
unsigned声明的是一个无符号数据类型,也就是说,如果unsigned int i; 需要注意变量i永远不可能等于复数,除非强制类型转换。
第二类:控制语句关键字
for //循环语句
do //循环语句的循环体
while //循环语句的循环条件
break //跳出当前循环
continue //结束当前循环,开始下一次循环
if //条件分支语句
else //条件分支语句
goto //无条件跳转语句
switch //不解释
case //不解释
default //不解释
return //返回语句
这些关键字估计都快被用烂了吧?不解释!
下面,开始做点有意义的事情,着重解释以下的关键字:
第三类:存储类型关键字
auto
extern
register
static
让我们一一来看这四个关键字:
1、auto关键字:声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。不明白?无视他好了,编译器默认的缺省情况下,所有的变量都是auto的。
2、extern关键字:我们都知道,一个变量或函数,可以在a.c文件中定义,而在b.c文件中使用,这个时候,b.c就需要使用extern关键字来声明这个变量和函数,目的是为了告诉编译器,这个函数在b.c之外,别让我编译不过!
3、register关键字:这个关键字就很少用到了,但是却十分有用。它的目的是告诉编译器尽量把这个变量放到寄存器中,这样提高存取速度,但是不是能真的放到寄存器中却不一定,毕竟寄存器的数量是有限的。在我们的二进制翻译器中,这个关键字被巧妙的用于线程切换。
4、static关键字:好吧,我承认我土了,我就是栽在这个关键字上的。static有两种修饰,
分别如下:
(1)修饰变量:变量分为全局变量和静态变量,都存储在内存的静态区中。
首先,当static修饰全局变量的时候,该变量的作用域仅被限定在当前文件中,别的文件即使使用extern关键字也无法使用这个变量。
其次,当static修饰局部变量的时候,该变量在哪个函数体中定义,就只能在哪个函数体中使用。也许你会说,这不跟普通局部变量一样么?不一样!别忘了他是被存储在内存的静态区中,所谓的静态区就是全局区,用来存放全局变量和静态变量的,程序不结束,这个区是不会被释放的,所以即使定义静态局部变量的函数结束,改静态局部变量仍然存在,下次访问改函数的时候,这个变量的值仍然是上次的值!举个例子把:
void foo(){
static int i=0;
i++;
printf("%d\n",i);
}
int main(){
foo();
foo();
}
这个小例子的执行结果是什么呢?答案是:
1
2
对的,静态局部变量只能被初始化一次,并且值会被保留,使用这个有两个好处,一个是可以计算函数被调用的次数,一个是可以减少函数构建局部变量的开销,自己体会一下把。
(2)修饰函数:经常见这种形式,但没怎么用过,也就没去想。其实这个作用跟静态全局变量相似,也是限定函数的作用域为本文件。这样作的好处就是不用操心是否会跟别人编写的文件里的函数重名。(我这里栽了一下,太弱了~不甘心阿!)
第四类:其他关键字
const
sizeof
typedef
volatile
下面,也是一样,一一解释下这些关键字:
1、const关键字:这是一个很有意思的关键字,他修饰的变量是只读的,不能被修改;很多时候,编译
器会将其优化成一个常量。const经常被用来修饰函数的参数,表示不希望这个参数值被函数体内的代码意外的改变。其实,最有意思的是用const修饰一个指针,让我
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论