C语言常量变量表达式

常量变量表达式

<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是从缓冲区中读取数据如果缓冲区没数据就会被卡住。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • 1.编译程序(1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a.o...
    萌面大叔2阅读 1,256评论 0 1
  • 1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或...
    哈哈哎呦喂阅读 642评论 0 0
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 8,694评论 9 66
  • 1.你自已决定是否需要有正负: 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个...
    Xiho丶阅读 2,059评论 0 2
  • 琳purple阅读 178评论 0 0