C语言事实上不简单:sizeof

问:C语言中一共同拥有多少个keyword?

答:32个。

答不上来的没关系。非常正常。我们玩的是程序的艺术。而不是背数字。

只是这个特殊的数字1<<5也是非常好记的-.-。


问:sizeof是函数还是keyword?

第一次看到这个问题,你可能会认为有点莫名其妙,sizeof当然是函数了,由于sizeof后面都跟了个括号,这显然是函数的象征。

可是既然我这么问了。你可能也猜到了,sizeof不是个函数,它是个keyword!长期以来由于sizeof的"标准使用方法",导致sizeof极easy被理解为一个函数。

尝试执行以下的代码:

#include <stdio.h>int main()
{int num = 5;printf("%d\n", sizeof(num));printf("%d\n", sizeof(int));printf("%d\n", sizeof num);getchar();return 0;
}
sizeof num竟然也能正确输出4,可见它真的不是函数。

只是sizeof int就是错误的了。它会产生例如以下错误:

error: expected primary-expression before "int"
由于int前面仅仅能跟auto、unsigned等,况且sizeof int要怎么来理解?是想计算大小呢?还是想表示"sizeof"类型的int变量呢。

查阅相关文档后总结例如以下:

当要计算变量的大小,比如基本类型(int、double)的变量,结构体变量(实例)时。能够不用括号。

当要计算一个类型时,不能省略括号。

无论什么场合都加上个括号,一是统一,而是能使程序可读性更强。且不易出错。我的目的并非为了省略这个括号,省略了并不会让事情变得更好。我所想要表达的是sizeof的还有一方面:由于如今我们知道了sizeof不是函数而是keyword,所以其本质也就全然不同了。函数是在执行时确定的,而keyword是在编译时确定的。差别的话。尝试执行例如以下程序:

#include <stdio.h>int main()
{int cc[10];printf("%d\n", sizeof cc[999999999]);getchar();return 0;
}

上面的程序并不会出错。而是正确输出了4。

并非由于sizeof真的去找相对于cc首地址偏移999999999个位置的那个内存,正如上文所述。sizeof在编译时确定。所以它依据cc[X]的类型来确定大小。由于sizeof没有去訪问这些地址,所以上面程序语法上没有不论什么问题,仅仅只是逻辑上来说好像没什么实际意义。你能不能想到一个能证明sizeof真的没去"执行"括号中的东西呢?事实上挺简单,试试执行例如以下代码:

printf("%d\n", sizeof(printf("hactrox")));
其结果为4,并且"hactrox并没有被输出!

没被输出说明sizeof真的没有去调用括号中的东西。可是为什么是4呢?由于sizeof是依据类型来确定的,对于printf或者是函数,sizeof以其返回值类型来确定。由于printf返回输出字符的数量。这个数量是int类型的,所以就相当于sizeof(int),所以是4。可能你还不知道printf的这个特性。试试执行下面代码:

#include <stdio.h>
int main()
{int num = printf("hactrox\n");printf("%d\n", num);getchar();return 0;
}
一个更直接的样例例如以下:

#include <stdio.h>int fun()
{printf("hactrox");return 5;
}int main()
{printf("%d\n", sizeof(fun())); // 函数没有被运行,依据其返回值类型从而输出4getchar();return 0;
}

关于sizeof另一个须要注意的地方。试试在脑海中执行以下的程序。得出一个结果以后再去执行它:

#include <stdio.h>#define SIZE_OF_ARRAY (sizeof(array) / sizeof(array[0]))int main()
{int array[] = {1, 2, 3, 4, 5};for(int d = -1; d < (SIZE_OF_ARRAY-1); d++)printf("%d\n", array[d+1]);printf("END\n");getchar();return 0;
}
是不是跟你想的不太一样?为什么数组一个都没输出?原因就在于sizeof返回的是unsigned int。当int与unsigned int比較的时候,int是要转成unsigned int的,当int <0的时候,这样的强制转换自然也就悲剧了,其结果是MaxValue(unsigned int)-abs(int),那么当d = -1的时候,自然就转变成一个相当巨大的数了,for循环当然也就不运行了。

#include <stdio.h>int main()
{int a = -1;unsigned int b = 10000;if(a > b)printf("a > b\n");elseprintf("a < b\n");a = (unsigned int)a;printf("%u\n", a);  // unsigned int要用%u输出而不要习惯地写成%dgetchar();return 0;
}

最后,由于刚才提到了unsigned int的最大值。C语言中想要输出int或是unsigned int的最大值要怎么办呢?有个简单的小技巧:

#include <stdio.h>int main()
{printf("Max value of unsigned int is: %u\n", ~(unsigned int)0);       // 结果仅仅能用%u表示printf("Max value of int is: %d\n", ~(unsigned int)0 >>1);   // 结果用%d, %u表示均可 getchar();return 0;
}


转载于:https://www.cnblogs.com/mfrbuaa/p/5420224.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php的可变函数,php之可变函数的实例详解

php之可变函数的实例详解php的可变函数&#xff0c;今天大概的了解下&#xff0c;是看php手册总结的&#xff0c;觉得用处不大&#xff1b;PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号&#xff0c;PHP 将寻找与变量的值同名的函数&#xff0c;并且尝试执行它。可…

Android应用安全开发之浅谈网页打开APP

一、网页打开APP简介 Android有一个特性&#xff0c;可以通过点击网页内的某个链接打开APP&#xff0c;或者在其他APP中通过点击某个链接打开另外一个APP&#xff08;AppLink&#xff09;&#xff0c;一些用户量比较大的APP&#xff0c;已经通过发布其AppLink SDK&#xff0c;开…

python history文件_【python之路19】文件操作

一、打开文件文件句柄 open(文件路径, 模式)打开文件时&#xff0c;需要指定文件路径和以何等方式打开文件&#xff0c;打开后&#xff0c;即可获取该文件句柄&#xff0c;日后通过此文件句柄对该文件操作。打开文件的模式有&#xff1a;r &#xff0c;只读模式【默认】w&…

php微信拍照图库js接口,ThinkPHP微信实例——JSSDK图像接口多张图片上传下载并将图片流写入本地...

发布图片最多可添加9张作品发布wx.config({debug: false,appId: {$signPackage["appid"]},timestamp: {$signPackage["timestamp"]},nonceStr: {$signPackage["noncestr"]},signature: {$signPackage["signature"]},jsApiList: [// 所…

2、在控制台上输出1—100数字

public class Test {// 定义类 public static void main(String[] args) {// 主函数&#xff0c;程序的入口 for (int i 1; i < 100; i) { System.out.print(i " "); } }}转载于:htt…

vue防抖和节流是什么_JavaScript防抖与节流,你知道多少?

JavaScript 的节流和防抖已经是老生畅谈的问题了&#xff0c;对于前端行业技术大牛来讲不过是小菜一碟&#xff0c;而对于绝大多数前端小白或初级工程师&#xff0c;绝对是必备的知识&#xff0c;值得学习。接下来小郭就带大家一起学习“防抖”与“节流”。防抖不知道大家第一次…

php中循环跳过,php for循环的exit / break / continue /goto 停止、跳过循环、继续循环...

php 与 JavaScript 有很多相似的地方&#xff1b; for循环中也有两个相同&#xff1b; 只是 php 比 js 多了一个 exit &#xff0c; 其他用法一样&#xff1b;for($i 1;$i<11;$i){if($i3){// exit; //当$i 3 代码停止运行&#xff0c;包括循环外的&#xff0c;后面的也停止运…

checkbox:全选与反全选

$(document).ready(function () {//全选checkbox$("#selectAll").click(function () {var checked $(this).prop("checked");$(":checkbox").prop("checked", checked);});$("tbody :checkbox").click(function () {var is…

python连接influxdb_python 访问 InfluxDB 数据库

我们开发了一个基于 TelegrapgInfluxDBchonographkapacitor 的气象站监控演示系统。通过modular-2 连接了一个气象站传感器&#xff0c;采集温度&#xff0c;湿度&#xff0c;PM2.5&#xff0c;PM1.0 &#xff0c;照度&#xff0c;大气压等参数。通过MQTT 协议传送给Telegraph。…

location php,Nginx服务器中的location配置详解

语法location [|~|~*|^~] /uri/ {...}规则 &#xff1a; 表示精确的URI匹配(有兴趣的同学可以看一下url和uri的区别)&#xff5e;&#xff1a; 表示区分大小写的正则匹配&#xff5e;*&#xff1a;表示不区分大小写的正则匹配!~ && !~*&#xff1a;表示区分大小写不匹…

codevs4203山区建小学

/* 状态&#xff1a;f[i][j] 前i个村庄已经建了j个学校 转移&#xff1a;f[i][j]min&#xff08;f[i][j],f[ii][j-1]s[ii1][i]&#xff09; 1<ii<i-1 */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include &l…

gson解析php,php,android_关于 Gson 解析JSON数据。。。,php,android - phpStudy

关于 Gson 解析JSON数据。。。1.首先&#xff0c;我是从服务器端传回来的JSON数据如下&#xff1a;{"info":"succeed","user_id":"1","user_password":"9999","user_email":"95469qq.com",&q…

android安装python opencv_Python、C++、Android OpenCV 开发环境的配置

在 Mac 上折腾了一下 OpenCV 的配置&#xff0c;分别配置了 Python 、C 和 Android 上的开发环境&#xff0c;中间还遇到点坑&#xff0c;简要记录一下。OpenCV 的安装OpenCV 的安装有两种方式&#xff0c;可以通过下载源码自行编译&#xff0c;也可以通过homebrew来安装。源码…

如何防止用户重复提交表单

我们提交表单的时候&#xff0c;不能忽视的一个限制是防止用户重复提交表单&#xff0c;因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据&#xff0c;那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。那么如何规避这中重复提交表单的现象出现呢…

java要频繁调用容器时_Java知识点梳理

1、Struts2和SpringMVC的区别(1)设计理念&#xff1a;前者为有状态的Action(均为多例)&#xff0c;Action对象属性字段承载请求、响应&#xff0c;后者一般为无状态的Controller&#xff0c;请求直接封装到方法的参数中&#xff1b;(2)集中访问点不同&#xff1a;都属于前端控制…

基于busybox的Linux小系统制作 (initrd)

我们有时候有需要在busybox基础上&#xff0c;制作linux&#xff0c;可是却不知道具体怎么做&#xff0c;这里将对基于busybox的linux小系统制作做出详细的步骤说明。准备环境&#xff1a;1、一个Redhat完整系统的虚拟机&#xff0c;本次实例使用的是Redhat Enterprise Linux 5…

Java异常持久化,Log4j进行日志的数据库持久化,说SQL语法异常。

Log4j进行日志的数据库持久化&#xff0c;说SQL语法错误。。。在properties的配置中。。。。log4j.appender.db org.apache.log4j.jdbc.JDBCAppenderlog4j.appender.db.BufferSize1log4j.appender.db.drivercom.mysql.jdbc.Driverlog4j.appender.db.URLjdbc:mysql://localhost…

实现光晕效果_马自达6车灯升级激光四透镜实现四近四远光

汽车前照明大灯升级案例车型&#xff1a;马自达6灯泡色温&#xff1a;5600K透镜案例&#xff1a;米石激光 TMF激光原车灯泡型号&#xff1a;H1 H1雾灯&#xff1a;H3原车瓦数&#xff1a;80-100W升级方式&#xff1a;支架安装方式&#xff1a;有密封胶性质&#xff1a;热LED解码…

我使用的Chrome插件列表

AdBlock 用来屏蔽广告的&#xff0c;有一些网站会探测出你在使用AdBlock。如果一定要继续浏览的话&#xff0c;你可能需要暂停一下AdBlock Vimium 非常推荐喜欢vim的用户试试看这款插件&#xff0c;它的主要特色是用类vim快捷键来管理chrome的常用操作&#xff0c;比如标签页的…

matlab欧拉法程序,欧拉法matlab程序.doc

欧拉法matlab程序.doc 1.Euler法function[x,y]naeuler(dyfun,xspan,y0,h)xxspan(1):h:xspan(2);y(1)y0;forn1:length(x)-1y(n1)y(n)h*f(dyfun,x(n),y(n));endxx ;yy ;x10:0.2:1;y1(12*x1).^0.5;plot(x,y,x1,y1)>>dyfuninline( y-2*x/y );[x,y]naeuler(dyfun,[0,1],1,0.2)…