sizeof 再遇

 

看下面程序片段:

#include <stdio.h>
 
int main()
{
    int a=255;
    printf("%d\n", sizeof(++a));
    printf("%d\n", a);
 
    return 0;
}

结果:

4
255

这个是我们已经熟知的:sizeof是编译期求值,所以sizeof中表达式根本不计算,而是只需要知道此表达式的类型就可以得到值

再看:

#include <stdio.h>
 
char func()
{
    return 1;
}
 
int main()
{
    printf("%d", sizeof(func()));
 
    return 0;
}

结果:

1

这个也很显然嘛,func()这个表达式的类型就是其返回值的类型,上述代码中即char

#include <stdio.h>
 
void func()
{
}
 
int main()
{
    printf("%d", sizeof(func()));
 
    return 0;
}

结果也是1

void 是C中特意加上的类型,如不指定具体类型,其大小当然就是1了。没有这个类型之前,我们表示最小的类型只能用char了,但是char这个类型的本意是字符类型,如果实际上你要表示的不是字符,而仅仅因为其大小是1而使用char类型,势必会引起混淆。这也是C为什么会新增一个void类型的原因了。

上面有个陷阱,咋一看,还以为sizeof去求值的是函数指针呢,其实是表达式的值。

再看我变成这样:

#include <stdio.h>
 
char func()
{
    return 1;
}
 
int main()
{
    printf("%d", sizeof(func));
 
    return 0;
}

有人想,这下总该是理解成函数指针吧!那么你错了,这次它的结果还是1。等会告诉你原因。

再改一下:

#include <stdio.h>
 
char func()
{
    return 1;
}
 
int main()
{
    printf("%d", sizeof(&func));
 
    return 0;
}

这次对了,终于顺利打印出结果4. 这次是评估出是函数指针了

思考一下: 为什么会出现这两个结果。C中不是规定,函数名和对函数名取地址都是函数指针类型吗?

你没错,可是我也不知道为什么。呵呵,卖关子了

这可能是编译期理解的问题了,因为这个时候本身就是会产生歧义的。gcc可能直接把函数名这个表达式认为表示函数,表达式的值也就是其返回类型了

这里做了个测试:

1. gcc编译器会得到结果 sizeof(func) 为1

2. 而MS的编译器却直接认为是非法的sizeof操作,编译通不过

 

所以不用过于纠缠语法上本身存在歧义的特殊情形。编译期会做不同的解释。

过些天查找下ISO C标准,看是否对这种情况有规定。

转载于:https://www.cnblogs.com/chio/archive/2008/09/21/1295105.html

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

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

相关文章

mybatis错误之配置文件属性配置问题

在mybatis的配置文件SqlMapConfig.xml中&#xff0c;可以在开始的地方先加载一个properties节点&#xff0c;用来定义属性变量。 1 <!-- 加载属性文件 --> 2 <properties resource"db.properties"> 3 <!--properties中还可以配置一些属性…

weblogic环境搭建

官方指导文档说明&#xff1a;http://docs.oracle.com/cd/E24329_01/web.1211/e24493/getst.htm#autoId12配置管理员用户名和口令&#xff1a;名称&#xff1a;weblogic密码&#xff1a;weblogic域名&#xff1a;sniper说明&#xff1a;This user is the default administrator…

20个方法让你摆脱坏习惯

原文&#xff1a;20 Tricks to Nuke a Bad Habit翻译&#xff1a;弥缝&#xff08;褪墨&#xff09; 你的生活正在被坏习惯不断地侵蚀&#xff1f;我从几年前开始改变我的习惯&#xff0c;现在我已经养成以素食为主的用餐、每天锻炼身体、每天写新文章、早起等等好习惯&#xf…

Stream流思想和常用方法

一、IO流用于读写&#xff1b;Stream流用于处理数组和集合数据&#xff1b; 1、传统集合遍历&#xff1a; 2、使用Stream流的方式过滤&#xff1a; 其中&#xff0c;链式编程&#xff08;返回值就是对象自己&#xff09;中&#xff0c;filter使用的是Predicate函数式接口&#…

九九乘法表的C语言实现

#include "stdio.h"int main(){int i,j,a;printf("九九乘法表:\n");for(i1;i<10;ii1){for(j1;j<i;jj1){ai*j;printf("%5d*%d%d",i,j,a);if(ij)printf("\n");}}return 0; }转载于:https://blog.51cto.com/xmwen1/1697355

关于各种JOIN连接的解释说明【原创】

INNER JOIN的连接原理&#xff1a;1.从左表里取出第一行2.按照ON条件查找右表里的每一行3.找出匹配的行&#xff08;包括重复的行&#xff09;放在结果集里&#xff0c;不匹配的行则放弃。4.从左表里取出第二行5.重复步骤2-36.从左表里取出第三行7............. LEFT JOIN的连接…

Stream流方法引用

一、对象存在&#xff0c;方法也存在&#xff0c;双冒号引用 1、方法引用的概念&#xff1a; 使用实例&#xff1a; 1.1先定义i一个函数式接口&#xff1a; 1.2定义一个入参参数列表有函数式接口的方法&#xff1a; 1.3调用这个入参有函数式接口的方法&#xff1a; lambda表达式…

九度OJ 1054:字符串内排序

题目地址&#xff1a;http://ac.jobdu.com/problem.php?id1054题目描述&#xff1a; 输入一个字符串&#xff0c;长度小于等于200&#xff0c;然后将输出按字符顺序升序排序后的字符串。 输入&#xff1a; 测试数据有多组&#xff0c;输入字符串。 输出&#xff1a; 对于每组输…

为什么要在定义抽象类时使用abstract关键字

本文为原创&#xff0c;如需转载&#xff0c;请注明作者和出处&#xff0c;谢谢&#xff01;众所周之&#xff0c;在任何面向对象的语言中&#xff08;包括Java、C#&#xff09;&#xff0c;在定义抽象类时必须使用abstract关键字。虽然这已经习已为常了&#xff0c;但实际上ab…

android 播放assets文件里视频文件的问题

今天做了一个功能&#xff0c;就是播放项目工程里面的视频文件&#xff0c;不是播放SD卡视频文件。 因为之前写webview加载assets文件夹时&#xff0c;是这样写的&#xff1a; webView new WebView(this); webView.loadUrl(file:///android_asset/sample3_8.html); 依次类推&a…

转:Firebird 数据访问组件 (Delphi)

转自&#xff1a;http://www.faceker.com/200809/firebird-data-access-components.html 在 Delphi 下可访问 Firebird 数据库的组件非常多&#xff0c;但不管是 CodeGear 还是 FirebirdSQL 都没有推出正式官方的相关驱动和组件&#xff0c;有 Interbase 的存在&#xff0c;想让…

pku 3252 Round Numbers 组合数学 找规律+排列组合

http://poj.org/problem?id3252 看了discuss里面的解题报告才明白的&#xff0c;这个解题报告太强大了&#xff1a;http://poj.org/showmessage?message_id158333不多讲已经很详细了&#xff0c;不明白多看几遍肯定会明白的。 注意这里的公式c(i,j) c(i - 1,j -1) c(i - 1…

《The Coaching Booster》问与答

由Shirly Ronen-Harel和Jens R. Woinowski 编写的《The Coaching Booster》 一书探讨了不同的教练方法和实践&#xff0c;并介绍了一种教练框架&#xff0c;支持教练帮助人们达到他们的目标。\InfoQ 采访了Shirly Ronen-Harel 和 Jens R. Woinowski&#xff0c;谈论了他们的书为…

用一辈子去领悟的生活经典[转帖]

1、说话要用脑子&#xff0c;敏事慎言&#xff0c;话多无益&#xff0c;嘴只是一件扬声器而已&#xff0c;平时一定要注意监督、控制好调频旋钮和音控开关&#xff0c;否则会给自己带来许多麻烦。讲话不要只顾一时 痛快、信口开河&#xff0c;以为人家给你笑脸就是欣赏&#xf…

反射应用和获取Class对象的三种方式

一、写一个“框架”&#xff0c;可以创建任何对象运行任何方法 1、配置文件 2、使用类加载器ClassLoader&#xff0c;Properties集合是可以和IO流结合使用完成读取和写入数据的集合&#xff0c;方法参数列表是IO流&#xff1b; Class类的静态方法forName()创建Class对象&#x…

error: gnu/stubs-32.h: No such file or directory

/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory sudo yum install glibc-devel转载于:https://www.cnblogs.com/greencolor/archive/2012/05/03/2481286.html

Android得到一个闹钟在第三方

收集报警信息 闹铃时间,闹铃备注信息 闹铃引起系统变化的点&#xff1a; 1. Send Notification (正点闹钟能够设置不发送) 2. Play audio 闹铃信息结构体 ClockInfo{ String apkName; String startTime; String backup; } SendNotification SystemUI BaseStatusBar.java 在Base…

ASP.NET_读写Cookie

Cookie (HttpCookie的实例)提供了一种在 Web 应用程序中存储用户特定信息的方法。例如&#xff0c;当用户访问您的站点时&#xff0c;您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时&#xff0c;应用程序便可以检索以前存储的信息。 创建Cookie方法 …

【转】selector函数指针回调机制

selector可以叫做选择器&#xff0c;其实指的就是对象的方法&#xff0c;也可以理解为C语言里面的函数指针&#xff0c;在面向对象里面的对应概念。[self performSelector:selector(Hidden) withObject:nil afterDelay:2.8];//2.8秒之后调用selector里面的函数&#xff0c;很好…

8 种有趣的用于 Web 品牌的动物

当 Mozilla 推出最新移动浏览器 Fennec 时&#xff0c;很多人需要借助 Wikipedia 才知道 Fennec 是什么意思&#xff0c;Web 2.0 产品以各种古怪的命名著称&#xff0c;要么非常拗口&#xff0c;象 Flickr&#xff0c;要么很 cute&#xff0c;象 Google&#xff0c;或者干脆不知…