c语言中正确的常量表达式,C语言常量变量表达式-程序员宅基地

技术标签: c语言中正确的常量表达式  

常量变量表达式

常量

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

import Foundation

//let用来声明一个常量cst

let cst = 4

//改变常量的值 报错

cst = 5

代码cst = 5报错:

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

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

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

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

关于变量

变量注意:

%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;

}

表达式

表达式有变量常量运算符组成。

看一个表达式主要看两点, 功能和值。

比如 1 + 2这个表达式,值是3 功能是加。

表达式认识深入测试

下例打印几次gyk

example

int i = 1;

while (i++ < 50) {

printf("gyk\n");

}

//i++ 的值第一次是1 i++最后一次的值成立时49 故打印49次

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

格式输出

列举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);

运算符优先级

a9da3538da28

运算符优先级

细节

姑且一提

i+++1会被识别为(i++) + 1原则就是系统从头识别 能识别就确定自己的判断。

7%3, -7%-3, 7%-3, -7%-3 被除数/除数 = 整数 + 余数 1 -1 1 -1

scanf还是给一个思考:输入一个字符打印该字符, 输入一个字符打印一个字符,scanf容易出问题。这个scanf是从缓冲区中读取数据如果缓冲区没数据就会被卡住。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31738297/article/details/117058004

智能推荐

JWT(Json Web Token)实现无状态登录_无状态token登录-程序员宅基地

文章浏览阅读685次。1.1.什么是有状态?有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?服务端保存大量数据,增加服务端压力 服务端保存用户状态,无法进行水平扩展 客户端请求依赖服务.._无状态token登录

SDUT OJ逆置正整数-程序员宅基地

文章浏览阅读293次。SDUT OnlineJudge#include<iostream>using namespace std;int main(){int a,b,c,d;cin>>a;b=a%10;c=a/10%10;d=a/100%10;int key[3];key[0]=b;key[1]=c;key[2]=d;for(int i = 0;i<3;i++){ if(key[i]!=0) { cout<<key[i.

年终奖盲区_年终奖盲区表-程序员宅基地

文章浏览阅读2.2k次。年终奖采用的平均每月的收入来评定缴税级数的,速算扣除数也按照月份计算出来,但是最终减去的也是一个月的速算扣除数。为什么这么做呢,这样的收的税更多啊,年终也是一个月的收入,凭什么减去12*速算扣除数了?这个霸道(不要脸)的说法,我们只能合理避免的这些跨级的区域了,那具体是那些区域呢?可以参考下面的表格:年终奖一列标红的一对便是盲区的上下线,发放年终奖的数额一定一定要避免这个区域,不然公司多花了钱..._年终奖盲区表

matlab 提取struct结构体中某个字段所有变量的值_matlab读取struct类型数据中的值-程序员宅基地

文章浏览阅读7.5k次,点赞5次,收藏19次。matlab结构体struct字段变量值提取_matlab读取struct类型数据中的值

Android fragment的用法_android reader fragment-程序员宅基地

文章浏览阅读4.8k次。1,什么情况下使用fragment通常用来作为一个activity的用户界面的一部分例如, 一个新闻应用可以在屏幕左侧使用一个fragment来展示一个文章的列表,然后在屏幕右侧使用另一个fragment来展示一篇文章 – 2个fragment并排显示在相同的一个activity中,并且每一个fragment拥有它自己的一套生命周期回调方法,并且处理它们自己的用户输_android reader fragment

FFT of waveIn audio signals-程序员宅基地

文章浏览阅读2.8k次。FFT of waveIn audio signalsBy Aqiruse An article on using the Fast Fourier Transform on audio signals. IntroductionThe Fast Fourier Transform (FFT) allows users to view the spectrum content of _fft of wavein audio signals

随便推点

Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具_awesomemac-程序员宅基地

文章浏览阅读5.9k次。https://jaywcjlove.github.io/awesome-mac/ 这个仓库主要是收集非常好用的Mac应用程序、软件以及工具,主要面向开发者和设计师。有这个想法是因为我最近发了一篇较为火爆的涨粉儿微信公众号文章《工具武装的前端开发工程师》,于是建了这么一个仓库,持续更新作为补充,搜集更多好用的软件工具。请Star、Pull Request或者使劲搓它 issu_awesomemac

java前端技术---jquery基础详解_简介java中jquery技术-程序员宅基地

文章浏览阅读616次。一.jquery简介 jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互 jQuery 的功能概括1、html 的元素选取2、html的元素操作3、html dom遍历和修改4、js特效和动画效果5、css操作6、html事件操作7、ajax_简介java中jquery技术

Ant Design Table换滚动条的样式_ant design ::-webkit-scrollbar-corner-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏19次。我修改的是表格的固定列滚动而产生的滚动条引用Table的组件的css文件中加入下面的样式:.ant-table-body{ &amp;amp;::-webkit-scrollbar { height: 5px; } &amp;amp;::-webkit-scrollbar-thumb { border-radius: 5px; -webkit-box..._ant design ::-webkit-scrollbar-corner

javaWeb毕设分享 健身俱乐部会员管理系统【源码+论文】-程序员宅基地

文章浏览阅读269次。基于JSP的健身俱乐部会员管理系统项目分享:见文末!

论文开题报告怎么写?_开题报告研究难点-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。同学们,是不是又到了一年一度写开题报告的时候呀?是不是还在为不知道论文的开题报告怎么写而苦恼?Take it easy!我带着倾尽我所有开题报告写作经验总结出来的最强保姆级开题报告解说来啦,一定让你脱胎换骨,顺利拿下开题报告这个高塔,你确定还不赶快点赞收藏学起来吗?_开题报告研究难点

原生JS 与 VUE获取父级、子级、兄弟节点的方法 及一些DOM对象的获取_获取子节点的路径 vue-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏17次。原生先获取对象var a = document.getElementById("dom");vue先添加ref <div class="" ref="divBox">获取对象let a = this.$refs.divBox获取父、子、兄弟节点方法var b = a.childNodes; 获取a的全部子节点 var c = a.parentNode; 获取a的父节点var d = a.nextSbiling; 获取a的下一个兄弟节点 var e = a.previ_获取子节点的路径 vue