C 基础要点

C语言发展史

--C语言的原型ALGOL 60语言(也称为A语言),最早的块结构语言。
     --1963年,剑桥大学将ALGOL 60语言发展成为CPL语言,CPL最大的缺点就是太大了,以至于不能在很多应用程序中使用。
     --1967年,剑桥大学的Martin Richards 对CPL语言进行了简化,于是产生了BCPL语言,BCPL缺乏运行时的支持,而且运行很慢。
     --1970年,美国贝尔实验室的Ken thompson将BCPL进行了修改,提炼CPL语言的精华并起名为B语言,并且他用B语言写了第一个UNIX操作系统,它的字符处理机制太烂了,而且浮点数运算被实现的并不理想,处理指针时开销太大。
     --1972年左右,美国贝尔实验室的D.M.Ritchie在B语言基础上最终设计出了一种新的语言,取名为C语言。
     --1977年,为了使UNIX操作系统推广,Dennis.M.Rithie发表了不依赖于具体机器系统的C语言编译文本“可移植的C语言编译程序”。
     --1978年,美国电放电报公司(AT&T)贝尔实验室正式发表了C语言,同时由B.W.Kernighan和D.M.Ritche合著了著名的“The C Programming Language”一书,通常简称为“K&R”,也有人称之为“K&R”标准,但是在“K&R”中并没有定义一个完整的标准C语言。
     --1983年,美国国家标准化协会(American National Standards Institute),在“K&R”基础上制定了一个C语言标准,于1983年发表,通常称之为ANSI C,又称C89。
     --1990年,国际标准化组织ISO(International Organization for Standards)接受了ANSI C为ISO C的标准(ISO9899-1990),又称C99。

C语言的特点

        1》 语言,简洁,紧凑,使用方便灵活。C语言一共有32个关键字,9种控制语句,程序书写自由,压缩了一切不必要                 的成份。
        2》 运算符丰富。
        3》 数据类型丰富,具有现代语言的各种数据结构。
        4》 具有结构化的控制语句。
        5》 语法限制不太严格,程序设计自由度大。
        6》 C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件操作。
        7》 生成目标代码质量高,程序执行效率高。C语言一般只比汇编程序生成的目标代码效率低10%--%20。
        8》 C语言编写的程序可移植性好,基本不用太多的修改就能在各种平台上运行。

C的应用现状

操作系统内核开发领域几乎是唯一开发工具
            绝大部分操作系统是由C加上少量汇编语言开发的
            Linux、Windows、Vxworks、Unix

            在嵌入式领域占有绝对优势
            在网络服务器类相当大优势
                Apache、Oracle
            GUI应用领域
                大型商用程序采用C的较多
                Offices,SPSS,AutoCAD

            大规模、高性能计算、游戏开发以及一些传统的客户端软件和构件

C程序结构特点

程序由一个或多个函数组成
            必须有并且只能有一个主函数main()
            程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行
            C程序由语句组成
            用";"作为语句终止符
            习惯用小写字母,大小写敏感

C的编译过程

linux平台下我们用的编译工具 gcc  (GUN)编译器的集合;我们用的编辑工具 VIM 。

    注: 区别的编译器和编辑器的功用。
        -E     -S     -c       -o(更名)
     .c --> .i --> .s --> .o --> a.out
       预处理  编译   汇编    链接

main函数及其参数


#include <stdio.h>

//int main(void)
//argc命令行参数的个数  argv命令行参数组成的字符指针数组 且以NULL结束
int main(int argc,char *argv[])
{
    int i;
    printf("argc:%d\n",argc);

    //for(i=0;i<argc;i++)
    for(i=0;argv[i]!=NULL;i++)
    {
       printf("argv[%d]:%s\n",i,argv[i]);
    }

    return 0;
}

 

常用的字节和位之间的单位系

内存以字节为单元组成,每个字节有一个地址,一个字节一般由8个二进制位组成,每个二进制的值是0或1
            1T = 1024G
            1G = 1024M
            1M = 1024K      
            1K = 1024B      
            1B = 8b         Byte 字节   Bit 位

C语言的32个关键字

只有32个,很多功能由函数实现.

    auto  break  case  char  const  continue  default  do double  else

    enum  extern  float  for  goto  if  int  long  register  return

    short  signed sizeof  static  struct  switch  typedef  unsigned  union  void
    volatile   while

    volatile:告诫编译器该变量为易失易变的 不要随意优化!

常量与变量

    1》运行过程中,其值不能改变的量称为常量。12,-3,4.6,-1.23,.1234,'a',“hello”。

    2》在运行过程中可以改变其值的量叫变量。

    3》和其它高级语言一样,用来对变量,符号常量,函数,数组等数据对象命名的有效字符序列称为标识符

    注: 规定标识符只能由字母,数字和下划线3种字符组成。且第一个字母必须为字母或下划线。(有大小写之分)
             Class  class 为不同的变量名。

        注:ANSI C没有规定标识符的长度,但各个C编译系统都有自己的规定。如IBM——PC的MSC取8个字符。大于8个字符的只取前8个字符作为有效标识符。

整型变量

    1》 整型数据在内存的存储方式(补码),正数和0的补码和它的原码相同,负数是原码取反加1
    2》 整数的十进制数,八进制,二进制的相互转换和表示方法;

    10进制===>>2进制   (除二取余法)
    2     ===>>10     例10101    ==  1*2^0+0*2^1+1*2^2+0*2^3+1*2^4

   每一个十六进制对应4个bit

输出(printf)输入(scanf)语句的用法和简介

printf("hello %d\n",a);
scanf("%d",&a);
%   格式控制符
a   输出参数
几个%对应几个输出参数,也叫输出列表
%d %i    输出整数 int
%h     short
%u     unsigned int
%ld    long 
%lu    unsigned long
%lld   long long
%c     输出字符char
%s     输出字符串char *
%f     输出浮点型float
%lf    double
%p     输出地址 &value
%x     输出十六进制
%o     输出一个八进制

%%     输出一个“%”

位运算

         运算符           含义
         &             按位与    0&0=0,  0&1=0,  1&0=0,  1&1=1      清位<清0>
          |             按位或    0|0=0,  1|0=1, 0|1=1, 1|1=1      置位<置1>
          ^             按位异或  0^0=0,  1^0=1,  0^1=1,  1^1=0      相异为1  相同为0
          ~             取反
          <<            左移<移出去的丢掉 空出来补0>
          >>            逻辑右移<移出去的丢掉 空出来补0>
          >>            算术右移<移出去的丢掉 空出来补符号位>

运算符优先级

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[整型表达式]

左到右

 

()

圆括号

(表达式)/函数名(形参表)

 

.

成员选择(对象)

对象.成员名

 

->

成员选择(指针)

对象指针->成员名

 

2

-

负号运算符

-算术类型表达式

右到左

单目运算符

(type)

强制类型转换

(纯量数据类型)纯量表达式

 

++

自增运算符

++纯量类型可修改左值表达式

单目运算符

--

自减运算符

--纯量类型可修改左值表达式

单目运算符

*

取值运算符

*指针类型表达式

单目运算符

&

取地址运算符

&表达式

单目运算符

!

逻辑非运算符

!纯量类型表达式

单目运算符

~

按位取反运算符

~整型表达式

单目运算符

sizeof

长度运算符

sizeof 表达式

sizeof(类型)

 
3

/

表达式/表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式%整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

整型表达式<<整型表达式

左到右

双目运算符

>>

右移

整型表达式>>整型表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

整型表达式&整型表达式

左到右

双目运算符

9

^

按位异或

整型表达式^整型表达式

左到右

双目运算符

10

|

按位或

整型表达式|整型表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

可修改左值表达式=表达式

右到左

 

/=

除后赋值

可修改左值表达式/=表达式

 

*=

乘后赋值

可修改左值表达式*=表达式

 

%=

取模后赋值

可修改左值表达式%=表达式

 

+=

加后赋值

可修改左值表达式+=表达式

 

-=

减后赋值

可修改左值表达式-=表达式

 

<<=

左移后赋值

可修改左值表达式<<=表达式

 

>>=

右移后赋值

可修改左值表达式>>=表达式

 

&=

按位与后赋值

可修改左值表达式&=表达式

 

^=

按位异或后赋值

可修改左值表达式^=表达式

 

|=

按位或后赋值

可修改左值表达式|=表达式

 

15

,

逗号运算符

表达式,表达式,…

左到右

从左向右顺序结合

用户态空间

代码段:存放代码

数据段:static、全局变量、静态变量

栈       :函数变量,函数空间(8M,64)

堆        :申请的动态空间

内核态空间

内核进程、线程占用空间

特殊声明

register  int    i;                            (cpu寄存器)用于频繁改变的变量

volatitle  int   a;                             (告诫编译器,不要随意优化)用于易失易变的变量

typedef  unsigned int   u32;           把已经存在的类型 定义(别名) 为另一个类型

类型大小(64位操作系统)

           short s; //短整型                                                     sizeof(s) =  2  B
            int    i;//整型                                                            sizeof(i)  =  4  B  (32bit平台 大小是2B)
            long   l;//长整型                                                      sizeof(l)  =   8  B
            long  long ll;//扩展型整型                                       sizeof(ll)  =  8  B

            void    *p                                                               sizeof(p)  =  8  B(任何类型的指针在64bit平台上都是8B)

continue和break

continue                                         跳过当前该次的循环体 继续下一次循环

break                                             打破(跳出循环)

switch标签贯穿性


 * 标签作为执行的切入口,一旦匹配 则不再看别的标签,从该标签处 开始顺序执行 直到break
 * 这种特征称之位case语句的贯穿性,此时的break打破这种贯穿性


    switch(key){
       case 'A':
       case 'a':printf("-move left-\n"); break;

       case 'D':
       case 'd':printf("-move right-\n");break;

       case 'W':
       case 'w':printf("-move up-\n");break;

       case 'S':
       case 's':printf("-move down-\n");break;
    }

 

;