C 语言的谜题[转]

[多智能体强化学习] 王树森YouTube课程笔记 前言 近期在设计V2X资源分配任务下的状态空间和动作空间,可以说是一筹莫展,是自己菜,现在看来可能也是涉及到一些关于多智能体强化学习实现过程中过于细节的点,目前的知识储备还不够。因此打算用半周到一周的时间重电,希望之后能有进展。 本文内容来自于友人LX所推荐的油管教程,链接如下:多智能体强化学习,一共两节课40min左右。教程废话不多干货不少,老师的声音还好听,推荐直接去看原教程。 这里还要多一嘴,那就是对于强化学习来说,单主体和多主体的界限,在某种程度上来说是很模糊的,并不是场景中有多个主体需要.. 阅读详情

转者注:在文章开头看觉得蛮有意思,一直看下去就会发现了自己对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)”,于是我们就得不到我们想要的值。该程序修正如下:


 

(全文完)

Android 12.0 系统开机设置默认横屏显示 在12.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从两部分来实现,一部分是开机动画横屏显示,另一部分是系统显示横屏显示,从这两方面就可以做到开机默认横屏显示了。 阅读详情

相关推荐

AHP层次分析法在项目风险评估中的实战应用(含Excel模板)

本文详细介绍了AHP层次分析法在项目风险评估中的实战应用。通过构建风险层次模型、利用判断矩阵量化主观判断,并结合Excel工具进行权重计算与一致性检验,将模糊的定性风险转化为清晰的量化排序。文章以新产品上线项目为例,提供了完整的分析流程和可操作的Excel模板,帮助项目经理高效识别并优先处理核心风险。

weixin_29061465的博客 570

C语言的谜题[转]

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

weixin_34409822的博客 212

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 455

[转]C语言的谜题

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

hu17889的专栏 395

浅谈武术擂台格斗机器人大赛

武术擂台机器人赛是工科类专业的一个跨学科的竞赛项目,它涵盖了机械结构、硬件电路和计算机程序等技术领域。笔者在校期间有幸参加过四次这样的比赛,有成功也有失败,对此深有感悟。本文仅为个人观点,有说得不对的地方,望积极指出,希望能帮助到有需要的人。

weixin_43811044的博客 1万+

拯救者Y9000P 2022双系统实战:Ubuntu22.04分区优化与驱动避坑指南

本文提供联想拯救者Y9000P 2022款安装Ubuntu 22.04双系统的详细实战指南。重点讲解针对该机型的磁盘分区优化方案、NVIDIA显卡驱动安装避坑技巧,以及安装后的网络、时间同步等必备配置,帮助用户高效完成双系统部署并提升使用体验。

weixin_29208327的博客 423

[转] C语言的谜题

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

weixin_30808693的博客 74

CocosCreator | 自定义启动页之H5

01 效果对比 默认启动页: 自定义启动页: 02 启动页存在的意义 我们在 creator 中的开发的游戏都是基于 cocos engine,所以在展示我们的游戏之前,是必须要先加载 cocos engine,然后才是我们自己的业务代码 流程图如下: 而构建完成后未精简的 cocos engine 代码为 1.9M 如果再加上物理相关代码的话,一共是2M 别忘了,我们自己的首场景也要加载过程哦 所以,从游戏启动,到真...

Valiancer 5896

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

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

weixin_32950759的博客 181

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 730

使用FSL对DTI数据进行预处理

在fsl官网我们可以看到是同时使用了AP和PA图像处理,采用的是最小二乘法将2个图像合并为1个图像。–inindex此处需要处理的是PA图像,在acq_param.txt中我们是把这个放在第一行的,此处为1,如果处理的是AP图像,则此处为2。为了校正磁场引起的畸变,对DTI的B0像分别采集了A>P和P>A的反向编码的两种B0像。即如果AP和PA只有1个B0像时,那么这里就是两行,如果各有3个B0像则这里应该是6行。假设转换后的图像为sub01_AP.nii.gz和sub01_PA.nii.gz。

weixin_52073820的博客 4839

(转)C 语言的谜题

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

ocaicai的专栏 387

Claude Code设置中文输出指南

Claude Code 的语言配置其实并不复杂,只要做好全局的默认设置,再加上一些小的提醒技巧,就能完全避免突然切换英文的问题,让你全程用中文流畅地和 AI 助手协作,不用再被语言问题打断工作节奏,真正提升开发效率。

篮球界最会写bug的人;程序猿中打球最菜的人。 2228

(转)C语言的谜题

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

dskit的专栏 472

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

0724

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

qq_42200472的博客 308

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

Communist19的博客 1682

Devexpress16.2.6破解工具

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

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、付费专栏及课程。

余额充值