C语言谜题记录

看完了C语言谜题,收获颇多,进一步理解了C语言,从其中列出的每个例子中都能够学到很多之前被忽视的知识点。

这里记录几个不错的case.

下面的程序会输出什么?

#include <stdio.h>
int main()
{
    float a = 12.5;
    printf("%d\n", a);
    printf("%d\n", (int)a);
    printf("%d\n", *(int *)&a);
    return 0;
}

参考答案:

该项程序输出如下所示,

0

12

1095237632

原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0×41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double的内存布局,如下:

float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)

   double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)

然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:

float版:0×41480000 (在内存中是:00 00 48 41)

   double版:0×4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)

而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。

这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。

ATTENTION:

1,"hello"[2] == 2["hello"] = 'l'

2,C/C++中,以0开头的数字都是八进制的。

3,sizeof不是一个函数,是一个操作符,其求i++的类型的size,这是一件可以在程序运行前(编译时)完全的事情,所以,sizeof(i++)直接就被4给取代了,在运行时也就不会有了i++这个表达式。

4,switch-case体中的变量初始化语句不会被执行。

5,printf返回值是输出的字符个数。

6,stdout和stderr是不是同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会被输入,1)遇到回车,2)缓冲区满,3)flush被调用。而stderr则不会。

本文出自 “About:Blank H4cking” 博客,请务必保留此出处http://pnig0s1992.blog.51cto.com/393390/814005

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, printf
, float
, c语言程序题
, double
, 字节
, 输出
, 语言 1 # 00
, c 语言 51 字节 扩展
, 循环谜题
, 自增谜题
40题
c语言键盘记录器、linux c语言记录时长、c语言记录时间、键盘记录 c语言、c语言听课记录,以便于您获取更多的相关知识。

时间: 2024-10-02 04:49:38

C语言谜题记录的相关文章

go语言日志记录库简单使用方法实例分析_Golang

本文实例讲述了go语言日志记录库简单使用方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "os" ) func main(){  logfile,err := os.OpenFile("/var/golang/jb51.net.log",os.O_RDWR|os.O_CREATE,0);  if err!=nil {   fmt.P

一道面试题:c语言谜题

   FROM:酷壳        我们可以看到很多C语言相关的一些东西.比如<语言的歧义>主要告诉了大家C语言中你意想不到的错误以及一些歧义上的东西.而<谁说C语言很简单>则通过一些看似你从来不可能写出的代码来告诉大家C语言并不是一件容易事情.<6个变态的hello world>和<如何弄乱C的源代码>则以一种极端的方式告诉大家,不要以为咱们自己写不出混乱的代码,每个程序员其实都有把代码搞得一团乱的潜质.通过这些文章,相信你对编程或是你觉得很简单的C语言有

c语言-怎么记录下最小生成树的边、

问题描述 怎么记录下最小生成树的边. 求大神解答,怎么记录最小生成树的边?!!??????????? 解决方案 用临接矩阵法,或者节点法都可以. 比如有三个节点0 1 2,两个边0-2 1-2 临接矩阵就是 . (0) (1) (2) (0) 0 0 1 (1) 0 0 1 (2) 1 1 0 节点法就是 0 2 1 2 解决方案二: poj 2395 最小生成树的最大边poj2395(最小生成树最大边)最小生成树的最大边poj2395

.net多语言和数据集内多数据表的处理(1)

数据 1 考虑多语言的问题对于多语言,需要考虑两个方面,一个是界面,一个是数据库信息,对于界面的多语言问题比较简单,只要建立相应的资源文件就可以了,这里不再多说:比较复杂的是数据库信息的多语言化,这里说说Freight.net的解决方案. Freight.net将使用Storm.MultiLanguage构件来处理多语言. 该构件可对数据库中的字符串数据表及XML格式的字符串数据表进行操作.默认的数据库表名为DisplayString,默认的XML文件名为DisplayStringData.XM

.net多语言和数据集内多数据表的处理(3)

数据 3 考虑以上两种情况的综合 当以上两种情况凑在一块的时候,情况还会复杂一些,因为在我们的这个解决方案中,多语言和信息的主体是采用的松耦合,如果不采用松耦合就不能保证其通用性和可扩展性,但是采用了松耦合在数据集中多表操作时又会产生麻烦. 因为松耦合,所以在数据集中自动级连更新的时候并不能够自动更新,修改还无所谓,我们只要保证和多语言表关联的那个Guid不变就可以了,但是删除呢?我们总不能把信息主体删除了却又把多语言数据留着吧,更麻烦的是因为数据已经删除,我们很难知道删除之前与多语言数据表关联

微小说下线网友为何不买账?

风靡网络的微博小说,终于也步上当年博客的道路,进军传统出版业,从线上走到线下. 一个月前,一本名为<围脖时代的爱情>的小说正式出版,作者宣称"销售火爆,迅速登上畅销榜".不过有调查者发现,新上市的微博小说销量似乎并没有宣传中的那么好,实体书店中该书"都没有放在显眼的位置",几家知名的网上书店中的"销售纪录仅为个位数". 在微博上红极一时的微博小说缘何线下遇冷?作家陈村说:"技术革命带来的是信息革命,而不是文学革命,没有文学的

利用 .NET 框架简化发布和解决 DLL Hell 问题

解决|问题 摘要: 本文介绍汇编概念并说明 .NET 框架如何使用汇编解决版本和发布问题. 目录 简介 问题叙述 解决方案的特性 汇编:积木 版本与共享 版本策略 发布 摘要 -------------------------------------------------------------------------------- 简介 Microsoft .NET 框架介绍了几个新功能,旨在简化应用程序发布和解决 DLL Hell.最终用户和开发人员都熟悉版本和发布问题,这些问题会伴随着如

帮Python找“对象”

类 说是要"找对象",我们第一个看的却是个叫作"类"的语法结构.这里的类其实和我们日常生活中的"类"的概念差不多.日常生活中,我们把相近的东西归为一类,而且给这个类起一个名字.比如说,鸟类的共同属性是有羽毛,通过产卵生育后代.任何一只特别的鸟都是建立在鸟类的原型基础上的. 下面我们用Python 语言来记录上面的想法,描述鸟类: class Bird(object): feather = True reproduction = "egg

三个方面决定企业的流程管理

我们见识过不少的企业,从治理结构上有企业型的集团,也有一些家族式的集团,规模有所不同,行业也不相同,但是大家多多少少都开展过一些制度管理和流程之类的东西.他们会拿来很好的流程规范文件询问AMT公司的咨询顾问:你觉得我们的流程进展的怎么样?这个时候我们固然要看文件了,但是选择用三个方面来衡量这个企业流程管理做的怎么样: 第一,观察这个企业任意一次会议 比如说随机推开会议室的门,进行原始会议语言的记录.看这个会议从头到尾有多少次提到部门,提到个人,还有多少次提到流程.企业开会往往是沟通问题.分析解决