美文网首页C语言学习天花板技术文
C语言从零开始(五)-常量&变量

C语言从零开始(五)-常量&变量

作者: 天花板 | 来源:发表于2015-10-31 21:29 被阅读4531次

    今天我们来仔细说说常量和变量。

    一,常量

    记得博主当年学C语言的时候总是搞不懂什么是常量。统统当做是变量,当时并不影响写小程序,后来工作了做嵌入式开发时才暴露出基础不牢的问题。希望大家在学习时一定把概念搞清楚。

    1. 整型常量

    1.1 十进制整数

    这个不难理解,就是我们常说的自然数。如:

    int a = 123;
    int b = +145;
    int c = -32;
    

    上面的代码中,“=”右面的就是十进制整数。可以带正负号,一搬“+”号省略。

    1.2 八进制整数

    八进制的数表示为前面带“0”的数,如:

    int a = 0124;
    int b = +054;
    int c = -014;
    

    上面的代码中,“=”右边都是八进制整数。看到这种貌似多余的“0”就要反应出是八进制。

    1.3 十六进制整数

    与八进制不同,十六进制整数以“0x”开头,如:

    int a = 0x17c;
    int b = +0x123;
    int c = -0xfcc;
    

    上面的代码中,“=”右边的是十六进制整数。

    2. 实型常量:

    2.1 十进制小数形式

    与数学中的小数形式相同,如:

    double a = 0.0;
    double b = 0.29;
    double c = 21.45;
    
    float d = 0.1f;
    

    上面代码中“=”右面的就是十进制小数。值得注意的是,float类型赋值时,常量的后面要加"f",因为不加这个"f" 计算机会分配一个double类型大小的空间,而前面的变量类型又是float,这时就会报错。

    2.2 十进制指数形式

    指数形式表示如下:

    double a = 2.4E4;  // 2.4 * 10 ^ 4
    double b = 3.1e3;  // 3.1 * 10 ^ 3
    

    这是科学计数法的表示形式,第一行表示2.4乘以10的4次方。使用“E”或“e”都可以。

    3. 字符常量

    3.1 普通字符

    字符常量需要用单引号表示,或者用ASCII码值。还记得上一篇中《潜伏》里的故事吗?

    char a = 'A';
    char b = 65;
    

    上面代码中“=”右面的是字符常量。为什么?第二行明明是数字啊。因为ASCII码中65表示大写字母A,如果赋值给int类型的变量,它就是65,如果赋值给char型变量,它就是字母A。

    3.2 转义字符

    C语言中用反斜杠“\”加字符表示一直特殊的意义,叫做转义字符。下面是转义字符表。

    C语言转义字符表

    还记得HelloWorld程序吗?里面有这样一句话:

    printf("Hello World!\n");
    

    这句话中的\n就是个转义字符,表示在输出这行字之后,再输出一个换行符号。

    4. 字符串常量

    记得上一篇中说过,字符串的表示是用双引号" "

    char str[] = "ABCD";
    

    这句话的意义是定义一个字符数组,这个大家可以先不了解。“=”右面就表示一个字符串常量。

    需要说明的是,字符串的存储比较特殊,系统会自动在字符串后面加入一个'\0'符号。这个符号在转义字符表中可以找到,代表空字符。计算机用它表示一个字符串的结束。因此,"ABCD"在内存中其实是"ABCD\0"。

    那么,问题来了。请问"a"和'a'有什么区别呢?

    5. 符号常量

    又叫做宏常量,是一个预处理命令,格式如下:

    #define 常量名 常量
    

    我们看下面的代码:

    #define PI 3.1415926
    
    double a = PI * 2;
    

    上面的代码中由于有了第一句,第二句就相当于:

    double a = 3.1415926 * 2;
    

    值得注意的是,这种宏常量的表示方法相当于把定义中常量位置的东西原封不动地写在常量名的地方。经常有这样的题目:

    #include <stdio.h>
    
    #define sum 5 + 1;
    
    void main()
    {
        int a = 2 * sum;
        printf("%d", a);
    }
    

    请问,这段程序输出的结果是多少。如果你答12就错了,应该是11。不信你用计算机运行一下试试。

    原因就是2 * sum这句在编译器看来应该是

    int a = 2 * 5 + 1;
    

    如果你的本意是想得到12,那么定义中应该这么写:

    #define sum (5 + 1);
    

    二,变量

    1. 什么是变量?

    上一篇中我们讲到,我们的程序在运行过程中把数据保存在内存中,每个数据保存的位置都有一个地址。如果我们每次操作数据都要写一次地址(如:0x5e34a031)那么可读性太差。因此,在C语言中我们用一个个的变量操作对应内存中数据的操作。

    2. 变量的使用

    一个简单的 int a = 1;其实暗地里执行了以下操作

    • 定义变量
      int a,在内存中开辟了4Bytes的内存空间,并且为这个空间起了个名字,叫做a

    • 赋值
      = 1,这是变量的初始化,在a对应的内存空间中放入一个数1

    再次强调,C语言中,变量在使用前一定要初始化。否则会出现意想不到的错误。原因上一篇中讲过。

    例程讲解

    今天我们看一个简单的小例子。

    #include <stdio.h>
    
    void main()
    {
        int a, b, sum;
    
        int c = 3;
    
        a = 1;
        b = 2;
    
        sum = a + b + c;
    
        printf("sum = %d\n", sum);
    }
    
    程序运行结果

    程序分析:

    #include <stdio.h>
    

    我们编程需要用到很多现有的工具集合,我们叫做库。库里面都有什么呢,有各种各样的工具,叫做函数。比如我们向屏幕打印数据的printf就是函数。这个后面会细讲。这句话就是告诉计算机,我们会用到stdio.h这个库,让它提前准备好。只有引用了这个库,计算机才知道到哪里找printf这个函数。
    stdio.h叫做头文件。目前掌握这些就好了。后面会具体讲解。

    void main()
    

    这是一个函数的形式,后面会讲到。这个函数的内容写在两个大括号之间。目前只要知道main函数是所有程序的入口,我们写好的程序都是从这个函数开始执行的。换句话说,没有这个函数的程序无法执行。
    main函数有两种形式,第一种就是我们今天用到的:

    void main()
    {
        // 函数内容
    }
    

    另一种是:

    int main()
    {
        // 函数内容
        return 0;
    }
    

    这种形式带有一个返回值,两种形式功能基本相同。先这样理解。

    int a, b, sum; 
    int c = 3; 
    a = 1; 
    b = 2;
    

    这一段对四个变量进行了定义,对三个赋了初值。

     sum = a + b + c;
    

    这一行把a,b,c三个变量的值求和存入sum变量中。

    printf("sum = %d\n", sum);
    

    这句话打印出sum的值。这次的printf使用的很特殊,前面加了"sum =" 这个字符串,打印出来的效果参考结果图片。在打印结果中,%d被sum真正的值所代替,后面会仔细讲解。

    我是天花板,让我们一起在软件开发中自我迭代。
    如有任何问题,欢迎与我联系。


    上一篇:C语言从零开始(四)-基本数据类型&赋值
    下一篇:C语言从零开始(六)-运算符与类型转换

    相关文章

      网友评论

      • Cliper:感觉c和Java最大的区别就是指针。
        楼主可以对指针进行讲解一下,还有结构体啊:: ,–>等操作符
      • Cliper:请问
        如何将c++ 打包成一个.so文件?
        后面会讲吗?
      • 普通人也要努力呀:二级c自学了两个月过了,后来没有在看书和敲代码了,因为下学期转计算机重新要学c,发现了楼主,真的是很佩服,好文
        普通人也要努力呀: @天花板 s678: 好的,打算把楼主发的文全部看一遍,顺便说一句,正在买楼主推荐的书
        天花板:@s678 欢迎多交流:stuck_out_tongue_winking_eye:
      • 殇红树林:请教个问题,如何将一串由1和0组成的编码转化成字符串😇
        天花板:@红树林之殇 循环右移做与运算,拿到每一位后倒序输出
      • 孤寂如风:float类型赋值时,常量的后面要加"f",因为不加这个"f" 计算机会分配一个double类型大小的空间,而前面的变量类型又是float,这时就会报错。为什么你在后面的例子程序中没有在赋值时加'f'?
        天花板:@孤寂如风 哦,那个是要讲强制类型转换,所以不写f也不影响结果
        孤寂如风: @天花板 第六课的一个程序里
        天花板:@孤寂如风 后面哪个float赋值?
      • bd5bf59abf14:八进制除了要0开头,还要保证第二位不大于8
      • 亦一银河:太棒了
      • 6ad994b2d955:楼主还在更新吗,刚开始自学C语言,现在被常量变量搞得很头大囧,看了楼主的文章更是迷惑,就比如,楼主第一部分讲常量的时候, int a = 123,而后在变量部分,打的 int a,b,sum ; int c = 3;就拿这两种来说,我迷惑的是,同样都是用 int 来声明,但是为什么前面的就是常量,后面的就是变量,在代码格式上我分不清这到底是常量还是变量啊QAQ,求解惑啊,谢谢了
        6ad994b2d955:@天花板 很感谢,其实在我求助楼主之后,又搬着书仔仔细细,一个字一个字的扣着读,明白了到底怎么回事,和楼主的回答一样,但还是谢谢你,书读百遍,其义自见啊,
        天花板:@sun992195525gma 等号左边是变量,右边是常量
      • 就是那个布丁:楼主棒 我可以当做复习一遍 而且有的学的不牢
      • 4134115f0615:正在学习
      • de180fcf5f2b:八进制是以0开头的吗?
        那将它转化为十进制的时候要算那个0吗?
      • Dyua:讲的很细啊,很不错哦,作者好人....
      • 96f1b9943009:厉害 我最近也尝试写了两篇学习笔记 发现要把懂的东西组织起来好难。。
      • 月落unique:讲的很不错呢😊
      • 7a7e17701c0a:继续学习
      • 為愛逆戰:问一下小编,scanf (“%d”,&d); 和printf("%d,&d");有什么区别啊!还有printf("%d, d");和printf("%d,&d");的区别。
        為愛逆戰:@為愛逆戰 嗯,谢谢
        天花板:@為愛逆戰 第一个是从键盘读入一个数字,保存在变量d中;第二个和第四个输出int默认后面原样输出“,&d”;第三个输出int默认值后面原样输出“,d”。其实这些你自己在电脑上试一下就知道了。
      • 游泳de鱼:有python的么
        天花板:@游泳de鱼 这个不在计划中。可以看看开源的项目,并不难~
      • b1621cf6b325:不错
        天花板:@JOEZZ :smiley:
      • 高江江:👍
        天花板:@538cbdbcee7f :smile:
      • 想很多小姐:期待JAVA的。哈哈~
      • ec56a3ef5331:楼主讲不讲JAVA从零开始
        天花板:@三生三世枕上书 正在计划中,预计12月开始发布~
      • 字字珠玑:楼主加油啊,我现在也准备跟着你一起学呢
        天花板:@加纳利 感谢支持
        加纳利:需要需要啊,为了关注你,都注册简书啦!
        天花板:@字字珠玑 那一起加油吧,多提宝贵意见。不知道你们是否需要把这些基础的东西讲这么细~

      本文标题:C语言从零开始(五)-常量&变量

      本文链接:https://www.haomeiwen.com/subject/jrzfhttx.html