第一个C语言程序

来源:互联网 发布:理智与情感小说 知乎 编辑:程序博客网 时间:2024/04/27 03:47
-
先简单的介绍先C语言, C语言是一种用途广泛、功能强大、使用灵活的的过程性编程语言, 既可以用于编写应用软件,又能用于编写编写系统软件。C语言一共有37个关键字,9种控制语句、有34中运算符、C语言提供的数据类型包括;整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型。C语言的语法不太严格, 程序设计自由度大。C语言允许直接访问物理地址,能进行位操作。用C语言编写的程序可移植性好, 还有就是生成目标代码质量高, 程序执行效率高。

第一个C语言程序; 打印输出“ hello world”
#include <stdio.h>             //  告诉编译器在本程序中包含标志输入、输出库的信息
int main()                           //  main()函数程序的入口, 每个程序都必须有一个main()函数
{
    printf("hello world");      // 调用printf()函数 输出“hello world”
    return 0;                       //函数执行完毕时返回函数的值0
}                                       //函数结束的标志
想要在屏幕上输出“hello world”   首先得新建一个以.c结尾的文件(程序源文件)经过编译、链接、运行,最后输出到某个地方。
      在windows下的运行过程

1、编辑源文件 .c

2、编译成目标文件.obj

3、连接——将目标程序库函数其他目标程序连接起来,生产可执行文件,文件扩展名为.exe

    4、执行。 
     在IOS下的运行过程
       1、编辑源文件 .c

2、编译成目标文件 cc-c 原文件(编译生成 .o文件)    

3、连接文件 cc .o文件(连接生成可执行文件 a.out文件)

    4、执行。 ./a.out 

一个c语言程序,都是由函数和变量组成的,
函数中包含一些语句,以指定所要执行的计算操作。
变量则用于存储计算过程中使用的的值。

c语言的基本元素

1符号集——C语言使用的基本符号。

2标识符——用来标记常量、变量、函数及文件名字的字符序列。(标示符的命名规则是只能以字母和下划线开头,可以使不数字,不能使用符号和C语言中的关键字)

3关键字——C程序规定的,具有特定含义、专门用作语言特定成分的一类标识符。ANSI推荐的C语言关键字是32。关键字全部应该小写。


c语言中的数据类型图

黑马程序员 — 第一个C语言程序 - 自信达人 - 努力进入黑马的日子
 
 整型又可以分为是 短整型(short) 整型(int) 和长整型(long)
 

 C的数据类型

数据是操作的对象,数据类型是指数据的内在表现形式。如(数据代码、存储、运算)。

1基本类型整型、字符型、实型。

2构造类型:在基本类型的基础上,按照某种构成规则构造而成的类型。数组、结构体、共用体、枚举型。

3指针类型:用于存储地址的一类数据类型。 

4空类型

编译器根据变量的数据类型,给变量分配存储单元

 常量与变量

1、符号常量——符号常量在其作用域内不能改变,也不能被赋值。

2、变量——变量由变量名变量值标识。

3 变量名实际上是一个符号地址,编译连接程序时给每个变量名分配一个内存地址,当程序访问变量值时,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。

 基本类型

1整形数据在内存中的存放,是以补码形式存放的。

2实型数据:单精度 双精度。

 在内存中以指数形势存放。

 若数据超过有效位,则超过C语言规定有效位的数据将被舍去,故产生误差。

3字符型数据:用一个字节存储单元存储。即将字符的ASCII存储到内存单元中。

 用单引号括起来的一个字符。

 转义字符——特殊字符常量或者控制字符常量,它们都以“\”开头。

 Charunsigned char区别:char7位数表示,最大表示编码为127的字符;unsigned char8位数表示,最大表示编码为255的字符。

 字符数据与整型数据可以相互赋值

 字符数据可以以字符数据输出,也可以以整型数据形式输出。

4字符串常量C语言中,必须是用字符数组来保存字符串常量。在内存中顺序存储

 用一对双引号括起来的字符序列。

 每个字符串常量结尾以一个字符\0作为结束标记。(一般由系统自动加上)。

 变量

1自动变量——在函数体内或复合语句中定义的非静态变量称为自动变量

 C语言编译时,不对自动变量赋初值。

 当程序执行到自动变量的作用域时,程序才为自动变量分配空间。当定义自动变量的函数或复合语句执行结束后,程序释放自动变量的存储空间。

 自动变量保存在程序的动态存储空间

静态局部变量——在函数体内或复合语句中用static定义的变量称为静态局部变量

 C语言编译时,对静态局部变量赋初值。

 静态局部变量存储在程序的静态存储空间

 静态局部变量在程序的整个运行期间均占用程序的静态存储空间,直到程序退出后才释放存储空间。

3寄存器变量——用register声明的变量。

4外部变量(全局变量)——在函数的外部定义的变量。它的作用域是从定义处开始,到本程序文件的末尾结束,在此作用域内,全局变量可以为程序的各个函数引用。

 C语言编译时,对全局变量赋初值。

 全局变量存储在程序的静态存储空间

 全局变量在程序的整个运行期间均占用程序的静态存储空间,直到程序退出后才释放存储空间。

注意:

1)当引用本源文件后面定义的全局变量或引用在其他源文件中定义的全局变量是,应在引用位置前,利用extern 声明该全局变量,以告诉编译器编译时,引用的是一个外部变量,在编译器连接时,将引用的外部变量的作用域扩展到本文件extern 声明处。

2)用static 声明的全局变量,不能被其他文件引用。

注意:

1变量声明分为定义性声明引用性声明

2)一般把建立存储空间的声明称为变量定义,把不需要建立存储空间的声明成为变量声明。

 不同类型数据间的混合运算

 不同类型数据进行混合运算时,不同类型的数据要先转换成同一类型,按照类型级别由低到高(charshortint——unsignedlongdoublefloatdouble)的顺序进行转换。

 强制类型转换——(类型名) 表达式强制类型转换也就是将存储数据的内存单元强制转换为另一种数据类型的单元大小。即强制将存放数据的内存单元改变。

 赋值时进行类型转换:将数据复制给变量时,将会将数据强制转换为要赋值变量的类型。一般短类型转换为长类型时,进行符号扩展;长类型转换为短类型时,仅赋值低位,难以保证数据的正确性。

函数的调用过程(补充)

 C函数其实就是一个程序模块。

 C函数在编译时,单独编译成一个指令模块,在函数模块开始处定义保护现场指令,将用到的CPU寄存器压入堆栈。在返回时定义了恢复现场指令,将堆栈数据恢复到CPU寄存器。

 在调用函数时,一般利用堆栈传递输入参数;利用EAX传递输出参数,注意在函数调用完成后,要维持堆栈平衡,且函数返回输出参数在EAX中,在使用输出参数前,不要改变EAX的值。

------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>

/*
 1.内存寻址由大到小,优先分配内存地址比较大的字节给变量 (也就是说变量在内存中是倒着存放的)
 
 2.变量越先定义,内存地址就越大
 
 3.取得变量的地址:&变量名
 
 4.输出地址:%p
 
 5.一个变量一定先进行初始化,才能使用
 */

int main()
{
    // 内存寻址由大到小
    int a = 10;
    int b = 20;
    int c;
    // &是一个地址运算符,取得变量的地址
    // %p用来输出地址
    // 0x7fff56f09bc8
    printf("a的地址是:%p\n", &a);
    // 0x7fff56f09bc4
    printf("b的地址是:%p\n", &b);
    // 0x7fff56f09bc0
    printf("c的地址是:%p\n", &c);
    //由于变量c没有经过初始化,所以直接拿来使用是不对的
    //int d = c  + 1
    printf("c的值是%d\n", c);
    return 0;
}
由这个类子可以知道, 在内存分配方面, 先定义的变量内存地址。 内存就像一个桶一样,先定义的就相当于先进去的,
内存分配方式
  内存分配方式有三种:
  (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>

/*
 1.变量的作用域
 从定义变量的那一行代码开始,一直到所在的代码块结束
 2.代码块的作用
 及时回收不再使用的变量,为了提升性能
 */
int test()                                     //定义一个test()函数, 
{
    int v = 10;                              //定义整型变量 v 并赋值 10;
    return 0;                                //函数执行完毕时返回函数的值0
}

int main()                                    //定义main函数()
{
    {
        double height = 1.55;         //定义一个爽进度变量 height , 赋值为1.55
        
        height = height + 1;           //自加一
        
        printf("height=%f\n", height);   // 输出height
    }
    
   /*
    {                                              //在大括号中定义一个整型变量 a
        int a = 10;
    }                                              // ‘ } ’ 表示本大括号中的代码执行完毕, 系统释放内存
    
    printf("a=%d\n", a);                //当执行到printf()函数时,编译器会报错, 它说 a 是为定义的, 因为a是定义在上面的大括号中的, 当       执行到‘}’时, a 被释放, 所以后面的printf()找不到,
   */
    
    
    int score = 100;                              //先定义一个score 等于100

    {                                                
        int score = 200;                         //在定义一个 score  等于200 ,为什么变量名一样还不报错呢, 因为他们的作用域不                                                                                       一 样,
        
        {
            int score;                                 
            score = 50;                              //定义一个score 等于 50
        }                                                  //当执行‘ } ’ 时 {}中的内存释放
        
        printf("score=%d\n", score);       // 说以第一个peintf()输出的是   200;
    }                                                     // 当执行 ‘  } ’时, 和它对应的 ‘{’ 之间的内存全部释放
    
    printf("score=%d\n", score);          //printf()输出的是没有在括号里面score 100;

    return 0;
}
0 0
原创粉丝点击