常量 常量:常量就是一个值确定后就不会发生改变的量。在C语言中...">
美文网首页
C语言常量变量表达式

C语言常量变量表达式

作者: YKDog | 来源:发表于2016-05-15 22:36 被阅读633次

    常量变量表达式

    <a name = "1">常量</a>

    常量:常量就是一个值确定后就不会发生改变的量。在C语言中可能体会不太深刻。但是理解这个概念却是很重要。以下用swift语言进行说明:

    import Foundation
    
    //let用来声明一个常量cst
    let cst = 4
    
    //改变常量的值 报错
    cst = 5
    
    

    代码cst = 5报错:

    cst is a let constant.可见常量是一个不可改变的值。在很多脚本语言中都有很好的这个特性, 然而在C中初学者并不体会明显。

    所以很多问题就可以理解了.

    疑难理解:比如有人会好奇++i++或者i++++的值是多少!?

    编译不通过。那这是为什么呢?首先++i++无论是计算前边的++还是后边的++都无所谓,最后都会出现++常量常量++。这个肯定是不允许的,不然就违背了常量的设计原则。i++++就不用谈了。这里还突出的是表达式是一个值的概念。当然后文会谈到怎么去看一个表达式。

    <a name = "1">关于变量</a>

    变量注意:

    • %d 与 %u
    • 位数的截断 和 拓展
    • 常用类型的字节数(32位环境)

    【%d与%u】

    思考下面代码结果:

    int main(int argc, const char * argv[]) {
      
        unsigned int ua = -1;
        printf("%d\n", ua);
        printf("%u\n", ua);
        
        int a = -1;
        printf("%d\n", a);
        printf("%u\n", a);
        
        
        return 0;
    }
    

    输出:

    -1

    4294967295

    -1

    4294967295

    对于这个结果其实并不意外, 也有人会说unsigned int不是只能存正数吗? unsigned int 与 int在申请空间这个作用上其实是没有任何区别的, 只是在用这个变量比较的时候怎么去读这个数据产生区别。这个在上一总结字母无限打印已经说明.
    计算机在存储数字的时候都以补码方式存储,不看怎么存只看怎么读。这就像那句 横看成岭侧成峰
    他们在内存中存储是一样的形式

    ua = 11111111 11111111 11111111 11111111

    a = 11111111 11111111 11111111 11111111

    至于你把第一为当为符号位 那就是-1.如果当一个无符号数字输出那就是很大的232 - 1.

    【截断】

    长整型数据赋值给短整型变量时会发生截断,即保留低位,舍去存不下的高位。
    这里给一个example

    example

         short a = 0b1111111100000001;
        
        char b = a;
        
        printf("%d\n", b);
    

    输出:1

    这个结果就是去掉高位八个1 省下00000001 那结果当然是1.当然 短字节向长字节会发展拓展。

    补充:【扩展】短整型数据赋值给长整型变量时发生扩展,正数高位补0,负数高位补1.

    正数高位补上0不会发生值大小改变,这个我不举例。
    有人会好奇负数,给example.

    example
    比如1字节下

    b = 1111 1110
    这个值是-2

    高位拓展比如两字节。这就相当于char 变为short了
    b = 1111 1111 1111 1110
    这个值还是-2

    所以在拓展情况下问题不会太大, 但是截取在绝对值比较小的时候会发生数据丢失。

    【类型字节】

    给一段代码:

        printf("sizeof(char) = %lu\n", sizeof(char));
        //sizeof(char) = 1
        printf("sizeof(char) = %lu\n", sizeof(short));
        //sizeof(char) = 2
        printf("sizeof(char) = %lu\n", sizeof(int));
        //sizeof(char) = 4
        printf("sizeof(char) = %lu\n", sizeof(long));
        //sizeof(char) = 8
        printf("sizeof(char) = %lu\n", sizeof(long long));
        //sizeof(char) = 8
        printf("sizeof(char) = %lu\n", sizeof(float));
        //sizeof(char) = 4
        printf("sizeof(char) = %lu\n", sizeof(double));
        //sizeof(char) = 8
    

    那么我们没有定义类型的常量是多少字节呢?

    see code:

    int main(int argc, const char * argv[]) {
        
        
        printf("sizeof() = %lu\n", sizeof(1));
        //4个空间和int一样
        
        printf("sizeof() = %lu\n", sizeof(1.2));
        //8个空间和double一样
        
        //所以在1.2默认8字节但是在末尾加上f之后.单精度4字节空间。所以精度要求不高的情况下加f节约内存。其实这个在应用开发的时候也无所谓了,加f显示素质。
        printf("sizeof() = %lu\n", sizeof(1.2f));
     
       
        
        //2147483648 = 2 ^ 31最大正数
        printf("sizeof() = %lu\n", sizeof(2147483648));//默认系统singed存
        //8存储不下了因为是有符号 最大为:
     
        printf("sizeof() = %lu\n", sizeof(2147483648u));
        //4 4位无符号能存储, 不解释。
        
        printf("sizeof() = %lu\n", sizeof(2147483647 + 1));
        //4 不必深究 变为1000~很大的负数没扩容
        
        return 0;
    }
    

    <a name = "1">表达式</a>

    表达式有变量常量运算符组成。
    看一个表达式主要看两点, 功能和值。
    比如 1 + 2这个表达式,值是3 功能是加。

    表达式认识深入测试

    下例打印几次gyk

    example

        int i = 1;
        while (i++ < 50) {
            printf("gyk\n");
        }
        //i++ 的值第一次是1 i++最后一次的值成立时49 故打印49次
    

    关键是 i++是一个表达式, 有值。如果你还去分析i的值变化过程速度肯定很慢。

    <a name = "1">格式输出</a>

    列举12

        printf("%+d\n", 10);
        //+10
        printf("%#o\n", 10);
        //012
        
        float f = 123.4567;
        
        printf("%f\n", f);
        //123.456703
        printf("%-7.2f\n", f);
        //123.46
        
         printf("%e\n", f);
        //1.234567e+02
        
        printf("%g\n", f);
        //123.457 以%f 或%e 中较短的输出宽度输出单、双精度实数
        //654.320984,6.543210e+002,654.321
        
        short a = 32;
        printf("%hd\n", a);
    

    <a name = "1">运算符优先级</a>

    运算符优先级

    <a name = "1">细节</a>

    姑且一提

    • i+++1会被识别为(i++) + 1原则就是系统从头识别 能识别就确定自己的判断。
    • 7%3, -7%-3, 7%-3, -7%-3 被除数/除数 = 整数 + 余数 1 -1 1 -1
    • scanf还是给一个思考:输入一个字符打印该字符, 输入一个字符打印一个字符,scanf容易出问题。这个scanf是从缓冲区中读取数据如果缓冲区没数据就会被卡住。

    相关文章

      网友评论

          本文标题:C语言常量变量表达式

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