`
tolys
  • 浏览: 115577 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

“茴字有六种写法”式的C语言笔试题

阅读更多
今天在CSDN上真的看见了孔乙己式的问题:用C语言,不用四则运算,对一个变量进行加1操作。答案是(i在某处定义了):
i = (int)&(((char*)i)[1]);

想出这个问题的兄台真是够孔乙己的——除了用+、-、*、/和++,还有别的方法对一个变量加1——茴香豆的“茴”字有六种写法……据说这是一道笔试题。sigh……有钻研精神,可是没有实用主义。
 
在这里解释一下为什么能够实现对i加1,以免有些初学者不懂,另一个目的也是希望大家引以为戒,不要这么孔乙己(关于指针的问题,可以参考我的文章“指针是通往地狱的捷径”):
 
首先,看最里面两层括号:
((char*)i)
 
这里将i从整型转换成一个ulong,并使之成为一个指向字符(字符串)的指针,记为ptr。然后是:
i = (int)&(ptr[1]);
 
这就是说,将ptr作为一个指向字符串的指针,这里ptr[1]就相当于*(ptr + 1),因为数组名其实就是地址,所以ptr[1]与*(ptr + 1)等价(有疑问的请参考“The C Programming Language, by Kernigham & Ritchie”)。比如:
 
/* C代码 */
char a[] = "hello, world";
char * ptr = a;
 
printf("%c, %c, %c, %c\n", *(ptr+4), ptr[4], a[4], *(a+4));
 
输出的结果将是:o, o, o, o
 
好了,既然ptr[1]等价于ptr + 1,那么整个表达式可以写成:
int i = (int)(ptr + 1);
 
由于char *所指向的是字符,只占用一个字节,那么指针算术ptr+1将导致ptr的ulong值加1,这样就相当于:
int i = int((ulong)i + 1);
 
这里有这些知识点:指针、数组、指针算术、强制类型转换。看起来出题人对这些知识点的了解还是比较深刻。可我必须说:真是孔乙己式的问题!这点稍微有点深刻的理解只不过为了炫耀而已!这种人能出面试题,且被该公司采用,简直就是中国IT人的耻辱,希望以后这位老兄不要说他是干IT的,咱丢不起那人!自作聪明的家伙!这就跟为了放屁就脱了裤子坐在马桶上,拿本书,然后放个屁走人是一个道理。只可惜,他还崩了一屁股水。
 
这种解答很有技巧性,也说明该老兄脑子里的筋很多,很多弯——去忽悠赵本山都绰绰有余,可是他不像搞IT的,更像是本山大叔,出的题也像“茴字有六种写法你知道吗?”和“1加1在什么情况下等于3?”,三者如出一辙。建议这位老兄搞点好本子,上春晚忽悠去,那里还有人捧场,还能逗乐子。
 
为什么说他崩了自己一屁股水:
1、这条语句的效率问题。要实现对一个变量加1,写成:
i + 1;
或者++i;
翻译成汇编代码基本就是:
ADD i, 1
而且这是单条指令的运算,用ALU就能完成,效率多高!再看看答案,两次强制类型转换,一个指针算术,最后一个赋值,翻译成汇编代码,不知道要多少条(与编译器有关)!效率当然低下!
 
2、溢出问题导致的错误。假如i的值正好是最大的有符号整数(假设int只有16位,那就是65535),将其转换成ulong,值不会变。然后加1,再转换成int,然后,你的答案就是绝对错误的,溢出了!
 
3、安全问题。i的初始值为0,转换成指针后指向了内存0,没关系,相当于NULL,加1后指向了1,不巧有个黑客发现了这段代码,并得到了这个指针,然后……你就等着哭吧,老兄!
 
出这道题的老兄,省省劲吧。要是我笔试or面试碰上这样的题,我绝对会鄙视他一番,然后问他:“茴香豆的茴字有六种写法,你会么?”问完之后,扬长而去——为出这种题的公司干活,不丢人么?
 
说实在的我也挺无聊,闲着没事跟孔乙己叫什么真?看来真得约上这位出题的老兄去后海边的孔乙己酒吧喝点酒,看他排出九文大钱,用手指蘸着酒在桌上画着,再听他拽一遍:“茴香豆的茴字有六种写法,你会么?”

相关推荐

    嵌入式C语言笔试题及答案.docx

    这些知识点是嵌入式C语言笔试题的常见主题,掌握它们有助于理解C语言的底层机制,编写高效且可靠的嵌入式代码。在面试或笔试中,深入理解这些概念并能灵活运用是至关重要的。通过解决这些问题,开发者可以提升自己的...

    那些经典的C语言笔试题(含答案)

    C语言笔试题解析 本资源总结了一些经典的C语言笔试试题,涵盖了BOOL、float、指针变量与“零值”比较的if语句、sizeof运算符、头文件中的ifndef/define/endif、const关键字、extern “C”、strcpy函数编写等多个...

    C语言笔试 题

    ### C语言笔试题知识点解析 #### 一、ANSIC/C++方面的知识 ##### 1.1 简答题 1. **如何在C中初始化一个字符数组** - 在C语言中,可以通过以下方式初始化一个字符数组: ```c char arr[] = "Hello, World!"; ``...

    2021年历年二级C语言笔试真题及答案.doc

    2021年历年二级C语言笔试真题及答案.doc 本文档旨在总结2021年历年二级C语言笔试真题及答案,涵盖了数据结构、算法设计、软件设计、数据库管理系统、E-R图等多个领域,共20道题目,每道题目都详细解释了对应的知识...

    经典C语言笔试题

    ### 经典C语言笔试题知识点解析 #### 一、变量与“零值”的比较 在C语言中,经常需要比较变量是否等于“零值”。根据变量类型的不同,比较方式也会有所不同。 ##### 1. BOOL变量与零值比较 **标准答案**: ```c ...

    嵌入式C语言笔试题.doc

    【嵌入式C语言笔试题解析】 1. 这个程序涉及到指针和位操作的知识。首先,程序声明了一个整型变量a和一个指向整型的指针p,然后将a的地址赋值给p。接着,*p被赋值为0x500(16进制,相当于1280)。之后,程序通过两...

    经典c语言笔试题

    ### 经典C语言笔试题知识点解析 #### 一、与“零值”比较的if语句 在C语言编程中,经常需要判断一个变量是否为零或等效于零的状态。这部分内容主要介绍了如何正确地编写用于比较的if语句。 ##### 1. BOOL变量与...

    C语言概念题大全及详细解答(经典)

    还不如去学茴香豆的茴字有几种写法 好好的一门手艺, 给糟践成这样了 估计也就本三学校会用这种试题,专科的嫌它浪费时间,职技的嫌没用 原帖在这: 【专题】下载频道分享季:135个经典资源大汇展 ...

    2022嵌入式C语言笔试题及答案例文.docx

    《2022嵌入式C语言笔试题及答案例文》主要涵盖了嵌入式开发中C语言的基础知识,特别是预处理器、宏定义以及无限循环等关键概念。以下是这些知识点的详细说明: 1. **预处理器(Preprocessor)** - `#define` 语句...

    C语言笔试题目集锦

    每种写法都有其适用场景,面试官可能会询问选择特定方式的原因。 5. 数据声明: 下面是各种类型的C语言变量声明: a) `int a;` // 整型数 b) `int *a;` // 指向整型数的指针 c) `int **a;` // 指向指向整型数...

    嵌入式C语言笔试题及答案.pdf

    常见的无限循环写法有 `while(1)` 和 `for(;;)`。使用 `goto` 实现的无限循环可能引发对程序员技能的质疑,因为这种方式往往与清晰的编程风格相悖。 5. **数据声明(Datadeclarations)**: - a) 整型数:`int a;` ...

    2011年9月计算机二级C语言笔试试题思路版).pdf

    这份材料是一份2011年9月计算机二级C语言笔试试题的参考解答及思路版,题型包括单项选择题、填空题、编程题等。内容涉及C语言的基本概念、操作符、数据类型、控制语句、函数、指针和数组等核心知识点。接下来,我将...

    c语言 面试题 笔试题 1

    ### C语言笔试面试知识点解析 #### 1. 预处理器宏定义 预处理器宏定义在C语言中是非常基础但又十分重要的一个概念。题目中给出的宏定义为: ```c #define SECONDS_PER_YEAR (60 * 60 * 24 * 365) UL ``` 这里有几...

    思远+1C语言认证笔试题

    然而,根据题目描述,这个程序会输出`* * *`,这可能是因为题目有误,实际的C语言代码会输出`$ $ $`。 11. 自增与自减运算符:`m++`是后自增运算符,意味着先使用`m`的当前值,然后增加`m`;`m--`是后自减运算符,...

    至计算机国家二级C语言笔试真题及答案学习.pdf

    计算机二级C语言考试是针对编程基础和理论知识的测试,涵盖了许多重要的编程概念和技术。以下是一些从题目中提取的关键知识点: 1. **排序和查找算法**: - 链表的查找:有序链表的线性查找最坏情况需要比较的次数...

    c语言面试题集(单片机)

    C语言面试题集针对单片机的考察涵盖了多个核心知识点,包括预处理器、死循环、数据声明、关键字Static、Const和Volatile、位操作、内存访问、中断、动态内存分配、Typedef以及一些复杂的语法。以下是对这些知识点的...

    C语言 全国计算机等级考试笔试真题

    根据给定的文件信息,我们可以总结出一系列与C语言及计算机科学相关的知识点: ### 1. 数据结构类型 - **非线性结构**:题目中提到的“二叉树”是一种典型的非线性数据结构。非线性数据结构指的是数据元素之间存在...

Global site tag (gtag.js) - Google Analytics