C 语言的谜题[转]

【重磅更新】CT/MRI LI-RADS 2024:肝细胞癌局部区域治疗后反应评估的核心突破与临床实践指南 减少过度治疗:辐射 LRT 的 Nonprogressing 类别避免了 “持续强化 = 存活” 的误判,降低不必要的再治疗风险;提高检出效率:非辐射 LRT 的辅助特征升级减少了 Equivocal 比例,更早识别存活肿瘤;统一评估语言:标准化的分类标准为放射科、肝病科、肿瘤科、肝移植科的多学科协作(MDT)提供了统一 “沟通工具”,助力治疗方案的精准制定。 阅读详情

转者注:在文章开头看觉得蛮有意思,一直看下去就会发现了自己对C语言的了解太小了。

 

转自:http://blog.youkuaiyun.com/haoel/archive/2009/06/02/4231029.aspx

 

这几天,本站推出了几篇关于C语言的文章如下所示:

我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语言中你意想不到的错误以及一些歧义上的东西。而《谁说C语言很简单》 则通过一些看似你从来不可能写出的代码来告诉大家C语言并不是一件容易事情。《6个变态的hello world》和《如何弄乱C的源代码》则以一种极端的方式告诉大家,不要以为咱们自己写不出混乱的代码,每个程序员其实都有把代码搞得一团乱的潜质。通过 这些文章,相信你对编程或是你觉得很简单的C语言有了一些了解。是的,很不容易吧,以前是不是低估了编程和C语言?今天是否我们又在低估C++和Java 呢? 本篇文章《C语言的谜题》展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且我也相信有相当的一些例子可能是我们日常工作可能会见得到的。通 过这些迷题,希望你能更了解C语言。如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试。

1、下面的程序并不见得会输出 hello-std-out,你知道为什么吗?


 

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

 2、下面的程序看起来是正常的,使用了一个逗号表达式来做初始化。 可惜这段程序是有问题的。你知道为什么呢?


 

参考答案 :这个程序会得到编译出错(语法出错),逗号表达式是没错,可是在初始化和变量声明时,逗号并不是逗号 表达式的意义。这点要区分,要修改上面这个程序,你需要加上括号: int a = (1,2);

3、下面的程序会有什么样的输出呢?


 

参考答案 :程序会输出4321,你知道为什么吗?要知道为什么,你需要知道printf的返回值是什么。 printf返回值是输出的字符个数。

 4、下面的程序会输出什么?


 

参考答案 :该项程序输出如下所示, 0 12 1095237632 原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0x41480000,十进制 是: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版 :0x41480000 (在内存中是:00 00 48 41)
  • double版 :0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)

而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。

 5、下面,我们再来看一个交叉编译的事情,下面的两个文件可以编译通过吗?如果可以通过,结果是什么?

 file1.c


 

file2.c


 

参考答案 :该程序可以编译通过,但运行时会出错。为什么呢?原因是,在另一个文件中用 extern int *arr来外部声明一个数组并不能得到实际的期望值,因为他们的类型并不匹配。所以导致指针实际并没有指向那个数组。注意:一个指向数组的指针,并不等于 一个数组。修改:extern int arr[]。(参考:ISO C语言 6.5.4.2 节)

 6、请说出下面的程序输出是多少?并解释为什么? (注意,该程序并不会输出 "b is 20")


 

参考答案 :该程序在编译时,可能会出现一条warning: unreachable code at beginning of switch statement。我们以为进入switch后,变量b会被初始化,其实并不然,因为switch-case语句会把变量b的初始化直接就跳过了。所 以,程序会输出一个随机的内存值。

 7、请问下面的程序会有什么潜在的危险?


 

参考答案 :本题很简单了。这个程序的潜在问题是,如果用户输入了超过80个长度的字符,那么就会有数组越界的问 题了,你的程序很有可以及会crash了。

 8、请问下面的程序输出什么?


 

参考答案 :如果你觉得输出分别是,10,4,11,那么你就错了,错在了第三个,第一个是10没有什么问题,第 二个是4,也没有什么问题,因为是32位机上一个int有4个字节。但是第三个为什么输出的不是11呢?居然还是10?原因是,sizeof不是一个函 数,是一个操作符,其求i++的类型的size,这是一件可以在程序运行前(编译时)完全的事情,所以,sizeof(i++)直接就被4给取代了,在运 行时也就不会有了i++这个表达式。

 9、请问下面的程序的输出值是什么?


 

参考答案 :好吧,如果你对于PrintInt这个宏有问题的话,你可以去看一看《语言的歧义 》中的第四个示例。不过,本例的问题不在这里,本例的输出会 是:1,8,64,1000,其实很简单了,以C/C++中,以0开头的数字都是八进制的。

10、请问下面的程序输出是什么?(绝对不是10)


 

参考答案 :本题输出的是100。为什么呢?问题就出在 y = y/*p;上了,我们本来想的是 y / (*p) ,然而,我们没有加入空格和括号,结果y/*p中的 /*被解释成了注释的开始。于是,这也是整个恶梦的开始。

11、下面的输出是什么?


 

参考答案 :本题并不简单的是考前缀++或反缀++,本题主要考的是&&和||的短路求值的问 题。所为短路求值:对于(条件1 && 条件2),如果“条件1”是false,那“条件2”的表达式会被忽略了。对于(条件1 || 条件2),如果“条件1”为true,而“条件2”的表达式则被忽略了。所以,我相信你会知道本题的答案是什么了。

12、下面的C程序是合法的吗?如果是,那么输出是什么?


 

参考答案 :本例是合法的,输出如下:

Hello! how is this? super That is C !

本例主要展示了一种另类的用法。下面的两种用法是相同的:

"hello"[2] 2["hello"]

如果你知道:a[i] 其实就是 *(a+i)也就是 *(i+a),所以如果写成 i[a] 应该也不难理解了。

13、请问下面的程序输出什么? (假设:输入 Hello, World)


 

参考答案 :本例的输出是“Hello, Wo”,scanf中的"%[^r]"是从中作梗的东西。意思是遇到字符r就结束了。

14、下面的程序试图使用“位操作”来完成“乘5”的操作,不过这个程序中有个BUG,你知道是什么吗?


 

参考答案 :本题的问题在于函数FiveTimes中的表达式“t = a<<2 + a;”,对于a<<2这个位操作,优先级要比加法要低,所以这个表达式就成了“t = a << (2+a)”,于是我们就得不到我们想要的值。该程序修正如下:


 

(全文完)

手把手教你低成本复刻大疆C板缓启动电路(附原理图与选型清单) 本文详细介绍了如何低成本复刻大疆C板缓启动电路,包括核心器件选型、电路搭建与调试实战、参数优化方法论及进阶改进思路。通过替代型号和优化设计,实现功能相近的缓启动电路,成本不到原方案的1/3,适合电子爱好者、在校学生和预算紧张的硬件工程师。 阅读详情

相关推荐

uniapp串口通信实战:从零搭建物联网设备控制App(附完整代码)

本文详细介绍了如何使用Uniapp实现串口通信,从零搭建物联网设备控制App。内容涵盖环境配置、串口初始化、数据收发、错误处理等核心功能,并提供了完整的代码示例,帮助开发者快速掌握跨平台串口通信技术,适用于智能农业、工业自动化等物联网场景。

weixin_30369041的博客 597

C语言的谜题[转]

这几天,本站推出了几篇关于C语言的很多文章如下所示: 语言的歧义 [酷壳链接] [优快云链接]谁说C语言很简单? [酷壳链接] [优快云链接]6个变态的C语言Hello World程序 [酷壳链接] [优快云链接]如何加密/弄乱C源代码 [酷壳链接] [优快云链接]C语言的谜题 [酷壳链接] [优快云链接] 我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉...

weixin_34409822的博客 212

BrainVision Recorder 和 BrainVision Analyzer 2.2 安装

本篇为《EEG处理》系列博客的第二篇,该系列博客主要记录EEG信号处理的学习过程中的软件安装和学习过程,方便以后查阅。本篇为BrainVision Recorder 和 BrainVision Analyzer 2.2 的安装过程。 BrainVision Recorder 和 BrainVision Analyzer 2.2 安装安装前奏Brain Vision Analyzer分析软件 安装Brain Vision Recorder记录软件 安装推荐几款个人使用的科研软件 安装前奏 Brain V

梁小憨憨的博客 5063

[转]C语言的谜题

<br />这几天,本站推出了几篇关于C语言的很多文章如下所示:语言的歧义 [酷壳链接] [优快云链接] 谁说C语言很简单? [酷壳链接] [优快云链接] 6个变态的C语言Hello World程序 [酷壳链接] [优快云链接] 如何加密/弄乱C源代码 [酷壳链接] [优快云链接] C语言的谜题 [酷壳链接] [优快云链接] <br />我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语言中你意想不到的错误以及一些歧义上的东西。而《谁说C语言很简单》则通过一些看似你从来不可

hu17889的专栏 395

Android息屏后台任务保活实战:从定时器失效到厂商白名单破解

本文深入探讨了Android应用在息屏后定时任务失效的根源,即系统为省电而触发的休眠机制。文章提供了从传统方案失效分析到实战破解的完整路径,核心在于引导用户将应用加入电池优化白名单并开启自启动权限,从而合法绕过限制。同时,结合WorkManager、AlarmManager等可靠定时方案,实现稳定的后台任务执行。

weixin_28475533的博客 422

C++新手也能搞定!Windows下Cesium-Native编译全流程(附依赖下载技巧)

本文为C++新手详细介绍了在Windows系统下编译Cesium-Native库的全流程。重点针对网络环境不佳的情况,提供了手动下载依赖库的实用技巧,并指导用户使用CMake配置、生成解决方案,最终完成编译与测试验证,帮助开发者成功构建这一处理3D地理空间数据的C++运行时库。

weixin_28839549的博客 380

[转] C语言的谜题

[转] C语言的谜题 C语言的谜题 来自酷壳http://coolshell.cn/articles/945.html posted on 2012-09-15 22:33 butterflydog 阅读(...) 评论(...) 编辑 收藏 var allo...

weixin_30808693的博客 74

RS422总线

①.RS422发送驱动器无高阻三态(浮空)状态RS422收发芯片,发送脚固定强驱动输出,永远钳位 A/B 差分电平,不能关断、不能悬空,只要芯片上电,TX+、TX - 就强制输出互补电压(一路高、一路低)。多条发送并联在同一组差分线上:两个驱动器一个拉 A 高、一个拉 A 低,B 线反向拉扯 → 电源→地大电流对灌,瞬间芯片过流发烫烧毁、总线电平短路错乱。注意:RS485 带DE/RE 收发使能脚:不用发送时可关闭驱动器,输出变成高阻浮空,让出总线,因此能多节点分时发送。③.多点通信方式,一主多从方式;

zhuimeng_1234的博客 222

c语言语句加密转换成符号,C 语言的谜题[转]

转者注:在文章开头看觉得蛮有意思,一直看下去就会发现了自己对C语言的了解太小了。转自:http://blog.csdn.net/haoel/archive/2009/06/02/4231029.aspx这几天,本站推出了几篇关于C语言的文章如下所示:语言的歧义 [酷壳链接 ] [优快云链接 ]谁说C语言很简单? [酷壳链接 ] [优快云链接 ]6个变态的C语言Hello World程序 [酷壳...

weixin_32950759的博客 181

STM32CubeMX之DAC产成正弦波

“在之前的文章中曾经介绍过用TIM产生PWM做DAC用,STM32定时器输出PWM做DAC。部分型号的STM32单片机内部有专用的DAC,本篇文章将介绍如何用内部DAC+DMA产生正弦波...

zhang062061的专栏 1513

【AI就业干货12】机器学习八股文速通:从损失函数到 XGBoost,一篇带走全部面试点

本文总结了机器学习面试的核心知识点,涵盖监督与非监督学习、线性模型、正则化、决策树、KNN/K-means、SVM、集成学习、梯度下降、评估指标、特征工程、降维、概率模型等内容。重点包括:损失函数选择(MSE/交叉熵)、正则化作用(L1稀疏/L2平滑)、决策树划分准则、集成学习方法(Bagging降方差/Boosting降偏差)、XGBoost优化等。提供了30秒速记口诀和XGBoost代码示例,帮助快速掌握面试要点。全文采用公式+代码+口诀的形式,系统梳理了机器学习从理论到实践的常见考点。

m0_51738372的博客 731

(转)C 语言的谜题

<br />这几天,本站推出了几篇关于C语言的文章如下所示:<br />语言的歧义 [酷壳链接] [优快云链接]<br />谁说C语言很简单? [酷壳链接] [优快云链接]<br />6个变态的C语言Hello World程序 [酷壳链接] [优快云链接]<br />如何加密/弄乱C源代码 [酷壳链接] [优快云链接]<br />C语言的谜题 [酷壳链接] [优快云链接]<br />我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语言中你意想不到的错误以及一些歧义上的东西。

ocaicai的专栏 387

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

(转)C语言的谜题

转自:http://blog.csdn.net/haoel/archive/2009/06/01/4231029.aspx这几天,本站推出了几篇关于C语言的文章如下所示: 语言的歧义 [酷壳链接] [优快云链接] 谁说C语言很简单? [酷壳链接] [优快云链接] 6个变态的C语言Hello World程序 [酷壳链接] [优快云链接] 如何加密/弄乱C源代码 [酷壳链接] [优快云

dskit的专栏 472

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

0724

 1.将任一整数转换为二进制形式。 将十进制整数转换为二进制形式的方法很多,这里介绍的实现方法利用了C语言能够对位进行操作的特点。对于C语言来说,一个整数在计算机内部就是以二进制形式存储的,所以没有必要再将一个整数经过一-系列的运算转化为二进制形式,只要将整数在内存中的二进制表示输出即可。 #include&lt;stdio.h&gt; main() { int x; printf("I...

qq_42200472的博客 308

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

2025级C语言第七次周测题解

金陵科技学院2025级软件工程学院第七次周测

Communist19的博客 1682

CCF计算机软件能力认证201903-2二十四点(C语言版)

ccf-csp计算机软件能力认证201903-2二十四点(C语言版) 题目内容: 解题思路   因为我只是用到了很简单的数学代换,所以思路可能比较奇怪……   首先将字符串转换为一个七个长度的数组,对于加减乘除分别对应1,2,3,4。然后对于每一次运算,将结果同时赋值给运算符的前后两个值,即1+1运算完后会变为2+2,3x3运算完后会变成9x9,那么对于最后结果,我们只需要找出运算符两侧值相同的值即为最后结果。   所以我们先进行乘除运算,运算完成之后,我们将重复的结果删去,即对于3x4变为12x1

qq_46177519的博客 713

c语言问题

:idea: vingt cinq + cinq trente 数字谜题的规则如下: (1) 不同的英文字母表示不同的数字 (2) 每一个数最左边一位不是0,所以上面谜题中,v、c、t都不是0 (3) 上面的题目是加,那就表示vingt这个五位数与cinq这个四位数的两倍相加后,会得到trente这六位数,其算式如谜题...

uncle_bacon的专栏 360

C语言的谜题

C语言的谜题 2009年5月31日陈皓发表评论阅读评论68,615 人阅读     这几天,本站推出了几篇关于C语言的很多文章如下所示: 语言的歧义 [酷壳链接] [优快云链接]谁说C语言很简单? [酷壳链接] [优快云链接]6个变态的C语言Hello World程序 [酷壳链接] [优快云链接]如何加密/弄乱C源代码 [酷壳链接] [优快云链接]C语

794

2015年蓝桥杯省赛B组第3题--三羊献瑞

观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 (如果有对齐问题,可以参看【图1.jpg】) 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。

拖延症重症患者 318

蓝桥杯真题 15省3-三羊献瑞

问题描述 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你输出“三羊献瑞”所代表的4位数字(答案唯一),不要输出任何多余内容。 若表达式不清楚,可参见下图。 输入 没有输入。 输出 输出一个数字,即“三羊献瑞”所代表的4位数字。 题目限制 1s, 1024KiB for each test case. 提示 用printf或cout输出答案

fucheng的博客 686

C语言太简单?这14道C语言谜题,你能答对几个?

原因是,sizeof不是一个函数,是一个操作符,其求i++的类型的size,这是一件可以在程序运行前(编译时)完全的事情,所以,sizeof(i++)直接就被4给取代了,在运行时也就不会有了i++这个表达式。"上了,我们本来想的是"y / (*p)",然而,我们没有加入空格和括号,结果"y/*p"中的"/*"被解释成了注释的开始。其实很简单了,在C/C++中,以0开头的数字都是八进制的。这个程序的潜在问题是,如果用户输入了超过80个长度的字符,那么就会有数组越界的问题了,你的程序很有可能会crash了。

caihuayuan4的博客 1055
上一篇: 网络数据包在不同网络环境下的丢失表现
下一篇: C++ 的恐怖
olncy
博客等级 码龄20年 30粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值