16道经典C语言面试题
- 格式:doc
- 大小:27.50 KB
- 文档页数:5
第1篇一、基础知识点1. 请简述C语言的发展历程。
C语言是由美国贝尔实验室的Dennis Ritchie在1972年发明的,它是一种高级程序设计语言,具有丰富的数据类型和运算符,广泛应用于系统软件、应用软件和嵌入式系统等领域。
C语言的发展历程大致可以分为以下几个阶段:(1)1972年:Dennis Ritchie开始设计C语言。
(2)1973年:C语言的第一个版本0.1发布。
(3)1975年:C语言的第一个正式版本C1发布。
(4)1978年:Brian Kernighan和Dennis Ritchie合著的《C程序设计语言》出版,使得C语言迅速流行。
(5)1983年:C语言的国际标准化组织(ISO)开始制定C语言标准,即C89标准。
(6)1990年:C语言的国际标准化组织发布了C90标准。
(7)2000年:C语言的国际标准化组织发布了C99标准。
2. 请简述C语言的特点。
C语言具有以下特点:(1)简洁、高效:C语言语法简单,执行效率高。
(2)跨平台:C语言编写的程序可以在不同的操作系统和硬件平台上运行。
(3)丰富的库函数:C语言提供了丰富的标准库函数,方便程序员进行编程。
(4)可移植性:C语言编写的程序具有较好的可移植性,可以在不同的环境下编译和运行。
(5)模块化:C语言支持模块化编程,便于代码的重用和维护。
3. 请简述C语言的数据类型。
C语言的数据类型分为以下几类:(1)基本数据类型:int、float、double、char等。
(2)枚举类型:enum。
(3)结构体类型:struct。
(4)联合体类型:union。
(5)指针类型:void。
(6)数组类型:数组是具有相同数据类型元素集合的实体。
4. 请简述C语言的基本语法。
C语言的基本语法包括:(1)标识符:标识符用于命名变量、函数、数组等。
(2)关键字:关键字是C语言中预定义的具有特殊含义的单词。
(3)运算符:C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。
16道c语言面试题C语言面试题在C语言的学习过程中,面试题是一个非常重要的环节。
无论是应聘工作还是进入高校深造,掌握面试题的解答技巧都能给我们带来巨大的优势。
下面,我将为大家总结并解答一些常见的C语言面试题,希望对大家的面试准备有所帮助。
1. 请解释一下什么是C语言?C语言是一种通用的高级编程语言,由Dennis M. Ritchie于1972年在贝尔实验室开发。
它被广泛应用于系统软件、应用软件和嵌入式系统的开发中。
2. 请说出C语言的特点。
C语言具有以下几个特点:- 简洁高效:C语言设计简洁,只包含少量的关键字和语法规则,编写出的代码效率高。
- 面向过程:C语言注重问题的解决过程,强调按照步骤编写程序。
- 低级语言特性:C语言提供了丰富的指针操作功能,能够直接访问内存地址,灵活性高。
- 可移植性:C语言的源代码可以在不同的机器上进行编译和执行。
- 强大的库支持:C语言有丰富的函数库,便于程序员快速开发各种功能。
3. 请解释一下变量和常量的区别。
变量是用来存储数据的一种容器,可以根据需要改变存储的内容。
而常量是指在程序中固定不变的值,一旦定义就不能修改。
4. 什么是指针?指针是一个变量,其值为内存地址。
通过指针,我们可以直接访问内存中的数据。
5. 请解释一下数组和指针之间的关系。
数组名本身也是一个指针,它存储了数组的首地址。
利用指针可以对数组进行遍历和操作。
6. 请示范一下C语言中定义和打印字符串的方法。
在C语言中,字符串可以通过字符数组表示。
定义方法如下:```char str[20] = "Hello, World!";```打印字符串的方法如下:```printf("%s", str);```7. 什么是函数?函数是C语言中的一段可重复使用的代码,用于完成特定的任务。
函数可以接收参数和返回值。
8. 怎样定义一个函数?函数的定义包括函数的返回类型、函数名、参数列表和函数体。
第1篇第一部分:C语言基础1. 面试题:请解释C语言中的“变量声明”和“变量定义”的区别。
解析:- 变量声明:告诉编译器即将使用一个变量,但不分配存储空间。
它只告诉编译器变量的名称、数据类型和存储类别。
- 变量定义:不仅告诉编译器变量的名称、数据类型和存储类别,还分配存储空间给变量。
```cint i; // 变量声明int i = 10; // 变量定义```2. 面试题:什么是内存泄漏?如何检测和避免内存泄漏?解析:- 内存泄漏:在程序运行过程中,由于疏忽或错误,导致已分配的内存没有被释放,导致内存占用逐渐增加,最终可能耗尽系统内存。
- 检测内存泄漏:可以使用工具如Valgrind、Sanitizer等来检测内存泄漏。
- 避免内存泄漏:- 确保所有分配的内存在使用后都被释放。
- 使用智能指针(如C++中的`std::unique_ptr`、`std::shared_ptr`)来自动管理内存。
```cvoid function() {int ptr = malloc(sizeof(int)); // 分配内存// 使用ptr...free(ptr); // 释放内存}```3. 面试题:请解释C语言中的指针和数组的关系。
解析:- 在C语言中,数组名本身就是一个指向数组首元素的指针。
- 可以通过指针访问数组元素,也可以通过数组下标访问。
```cint arr[10];int ptr = arr; // ptr指向数组的第一个元素int value = (ptr + 5); // 访问数组中索引为5的元素```4. 面试题:请解释C语言中的结构体(struct)和联合体(union)的区别。
解析:- 结构体:可以包含不同数据类型的成员,每个成员都有自己的内存空间。
- 联合体:所有成员共享同一块内存空间,在某一时刻只有一个成员有效。
```cstruct {int a;float b;} s;union {int a;float b;} u;```第二部分:C++基础1. 面试题:请解释C++中的构造函数和析构函数。
c的面试题及答案面试题一:请解释一下C语言的指针和引用的区别。
答案:在C语言中,指针和引用都是用来处理内存地址的。
它们的主要区别在于以下几个方面:1. 定义和使用方式:- 指针是一个变量,存储的是一个内存地址。
通过使用"*"操作符可以获取或修改该地址对应的值。
- 引用则是一个已存在对象的别名。
它在定义时需要和原对象进行绑定,并且无法更改绑定的对象。
2. 空指针和无效引用:- 指针可以被赋值为空指针(NULL)或无效的地址值,表示指针不指向任何有效的内存地址。
- 引用必须在定义时进行初始化,并且必须引用一个有效的对象。
3. 内存管理:- 指针需要显式地通过动态内存分配函数(如malloc())进行内存的分配和释放。
- 引用的内存管理则由编译器自动处理,无需手动管理。
4. 数组和函数的传递:- 指针可以用于处理数组或者作为函数的参数进行传递。
- 引用可以作为函数参数,但无法直接用于处理数组。
面试题二:请解释C语言中的堆和栈的区别。
答案:在C语言中,堆和栈是两种不同的内存分配方式,具有以下区别:1. 分配方式:- 栈是由编译器自动分配和释放的,它的空间有限,大小在编译时就已经确定。
- 堆是由程序员手动分配和释放的,它的空间相比栈更大,并且大小在运行时可动态调整。
2. 内存结构:- 栈的数据结构为“先进后出”的方式,即后进栈的数据先出栈。
- 堆则没有明确的数据结构,按照动态分配顺序分配内存。
3. 分配效率:- 栈的分配和释放速度要快于堆,因为栈只需要移动栈顶指针即可。
- 堆的分配和释放速度相对较慢,因为需要在运行时进行内存的动态分配和回收。
4. 使用方式:- 栈主要用于存储局部变量、函数调用和函数参数等数据。
- 堆主要用于存储动态分配的内存,如通过malloc()函数分配的内存块。
面试题三:请解释C语言中的宏定义和常量的区别。
答案:在C语言中,宏定义和常量都可以用来表示不可更改的值,但它们的区别如下:1. 定义方式:- 宏定义使用“#define”关键字进行定义,没有数据类型限制。
应届生c语言面试题
以下是一些可能的应届生C语言面试题:
1. C语言有哪些数据类型?
2. C语言中如何定义变量?
3. C语言中什么是常量?
4. 什么是函数?如何定义一个函数?
5. 函数的返回值是什么?
6. 什么是传值调用和传址调用?
7. 什么是数组?如何定义一个数组?
8. 什么是字符串?如何定义一个字符串?
9. 什么是结构体?如何定义一个结构体?
10. 什么是联合体?如何定义一个联合体?
11. C语言中的指针是什么?如何声明和使用指针变量?
12. 什么是递归函数?如何实现递归函数?
13. C语言中如何实现文件操作?
14. C语言中如何进行内存管理?
15. C语言中什么是预处理器指令?include和define的作用是什么?
16. C语言中什么是位运算?有哪些位运算符?
17. C语言中什么是条件编译?有哪些条件编译指令?
18. C语言中什么是枚举类型?如何定义枚举类型?
19. C语言中什么是强制类型转换?如何进行强制类型转换?
20. 描述一下C语言的内存布局,包括代码区、数据区和堆区。
以上是一些可能的面试题,当然,具体的面试题目会根据具体的公司和职位而有所不同。
在面试之前,你可以通过查阅相关资料和做练习题来准备这些面试题。
精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。
汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。
动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。
10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。
第1篇一、面试背景随着信息技术的快速发展,C语言作为一种基础且强大的编程语言,在操作系统、嵌入式系统、网络编程等领域有着广泛的应用。
为了评估应聘者的C语言编程能力,我们设计了以下面试题目。
本面试题目分为基础知识、编程实践和问题解决三个部分,旨在全面考察应聘者的C语言基础、编程技巧和问题解决能力。
二、面试题目1. 基础知识(50分)(1)选择题(20分)1. 下列关于C语言的说法,错误的是()A. C语言是一种高级语言B. C语言支持面向对象编程C. C语言具有丰富的库函数D. C语言广泛应用于操作系统、嵌入式系统等领域2. 在C语言中,以下哪种数据类型占用内存空间最大()A. intB. charC. floatD. double3. 以下哪个函数可以用来实现字符串的拷贝()A. strcpy()B. strcat()C. strlen()D. strncat()4. 以下哪个运算符可以用于交换两个变量的值()A. =B. &C. |D. ^5. 在C语言中,以下哪个结构体不能作为函数的参数传递()A. structB. unionC. enumD. all of the above(2)简答题(30分)1. 简述C语言的基本数据类型及其特点。
2. 解释C语言中的运算符及其优先级。
3. 简述C语言中的指针及其作用。
4. 简述C语言中的函数及其作用。
5. 简述C语言中的结构体、联合体和枚举类型及其作用。
2. 编程实践(50分)(1)编写一个程序,实现以下功能:- 输入一个整数n,计算从1到n的所有奇数之和。
- 输入两个整数a和b,判断a是否是b的倍数。
(2)编写一个程序,实现以下功能:- 输入一个字符串,统计字符串中各个字母的出现次数。
- 输入一个字符串,删除字符串中所有的空格。
(3)编写一个程序,实现以下功能:- 输入一个整数n,输出从1到n的所有素数。
- 输入一个整数n,输出从1到n的所有水仙花数。
第1篇第一部分:基础知识1. 问题:请解释C语言中的数据类型及其特点。
解析:- 基本数据类型:- `int`:用于整数存储,通常占用4个字节。
- `float`:用于单精度浮点数,通常占用4个字节。
- `double`:用于双精度浮点数,通常占用8个字节。
- `char`:用于字符存储,通常占用1个字节。
- `short`:用于短整数存储,通常占用2个字节。
- `long`:用于长整数存储,通常占用4个字节。
- 枚举类型:用于一组预定义的整数值。
- 结构体:用于将不同类型的数据组合成一个整体。
- 联合体:用于存储多个不同类型的数据,但同一时间只能存储其中一种类型的数据。
2. 问题:请解释C语言中的运算符及其优先级。
解析:- 算术运算符:`+`、`-`、``、`/`、`%`。
- 关系运算符:`==`、`!=`、`>`、`>=`、`<`、`<=`。
- 逻辑运算符:`&&`、`||`、`!`。
- 位运算符:`&`、`|`、`^`、`<<`、`>>`。
- 赋值运算符:`=`、`+=`、`-=`、`=`、`/=`、`%=`。
- 其他运算符:`++`、`--`、`()`、`[]`、`->`、`sizeof`、`&`、``。
- 运算符优先级:`()`、`[]`、`->`、``、`&`、`++`、`--`、`!`、`~`、`<<`、`>>`、`<`、`<=`、`>`、`>=`、`==`、`!=`、`^`、`|`、`&`、``、`/`、`%`、`+`、`-`、`<<`、`>>`、`&&`、`||`、`=`、`+=`、`-=`、`=`、`/=`、`%=`。
3. 问题:请解释C语言中的变量作用域和生命周期。
解析:- 局部变量:在函数内部声明的变量,作用域仅限于该函数。
1、在C语言中,以下哪个关键字用于定义一个结构体类型?A. classB. structC. unionD. enum(答案)B2、关于C语言的指针,以下说法错误的是?A. 指针是存储变量地址的变量B. 指针可以进行加减运算,但结果仍然是地址C. 空指针不指向任何有效的内存地址D. 指针变量的类型决定了它可以指向的变量类型及占用的内存大小(答案)D3、在C语言中,若要使用标准输入输出库函数,必须包含哪个头文件?A. <stdio.h>B. <stdlib.h>C. <string.h>D. <math.h>(答案)A4、以下哪个不是C语言的基本数据类型?A. intB. floatC. charD. string(答案)D5、在C语言中,数组名作为函数参数时,传递的是?A. 数组的第一个元素的值B. 数组所有元素的值C. 数组第一个元素的地址D. 数组的长度(答案)C6、关于C语言的循环结构,以下说法正确的是?A. while循环和do-while循环至少执行一次循环体B. for循环中的初始化表达式可以省略,但循环条件表达式和循环后表达式不能省略C. 三种循环结构(while, do-while, for)完全可以相互替代,没有区别D. 在任何情况下,for循环都可以被while循环替代,但反之不然(答案)D(注:虽然D 选项在技术上不完全准确,因为有些情况下for循环的简洁性是不可替代的,但从循环功能上来看,for循环能做的事情while循环也能做到,只是可能更冗长。
这里选择D作为最接近正确的答案。
)8、关于C语言的函数,以下说法错误的是?A. 每个函数都可以有返回值,返回值类型由函数声明时指定B. 函数可以有参数,参数列表在函数名后的括号内指定C. main函数是C程序的入口点D. 在一个C程序中,可以定义多个同名但参数列表不同的函数(答案)A(注:A选项错误在于并非每个函数都必须有返回值,void类型的函数就没有返回值。
c语言相关的基础面试题
以下是一些C语言相关的面试题,这些问题可以帮助你了解应聘者是否熟悉C语言的基本概念和编程技巧:
1. C语言有哪些基本的数据类型?
2. 什么是常量?什么是变量?请举例说明。
3. 如何在C语言中声明一个变量?
4. C语言中的运算符有哪些?请简要说明它们的优先级。
5. 请解释一下C语言中的指针是什么,以及如何声明和使用指针变量。
6. C语言中的函数是如何定义的?能否提供一个函数定义的例子?
7. C语言中如何实现数组的排序?
8. 请解释一下C语言中的结构体是什么,以及如何声明和使用结构体变量。
9. 什么是C语言的递归函数?请举一个例子来说明递归函数的实现。
10. C语言中的main函数是什么?它的作用是什么?
11. C语言中的内存管理是如何实现的?
12. C语言中的指针和数组有哪些关系?
13. C语言中的位运算符有哪些?它们的作用是什么?
14. 如何使用C语言中的条件语句(if-else)和循环语句(for、while)?
15. C语言中的文件操作是如何实现的?请简要说明一下文件操作的步骤。
16. C语言中的内存泄漏是什么?如何避免内存泄漏?
17. 什么是C语言中的宏定义?如何使用宏定义来优化代码?
18. 请解释一下C语言中的静态变量和全局变量。
19. 如何使用C语言中的函数指针来调用函数?
20. 请解释一下C语言中的链表是什么,以及如何操作链表。
16道经典C语言面试题
.用预处理指令声明一个常数,用以表明年中有多少秒
( * * * )
) 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
) 预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
) 意识到这个表达式将使一个位机的整型数溢出因此要用到长整型符号,告诉编译器这个常
数是的长整型数。
) 如果你在你的表达式中用到(表示无符号长整型),那么你有了一个好的起点。
.
)
的方法。
)
)
)
.
.
应
.
) 一个整型数) 一个有个整型数的数组) 一个有个指针的数组,该指针是指向一个整型数的) 一个指向有个整型数
数组的指针) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数) 一个有个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案是: ) ; ) *; ) **; ) []; ) *[]; ) (*)[]; ) (*)(); ) (*[])();
人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。
当我写这篇文
章时,为了确定语法的正确性,我的确查了一下书。
但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。
因为在被面试的这段时间里,我确定我知道这个问题的答案。
应试者如果
不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为
这次面试做准备,那么他又能为什么出准备呢?
. 关键字的作用是什么?
在语言中,关键字有三个明显的作用: )在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。
这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。
.关键字是什么含意?
已经在他
么.
如果应试者 ; 是一个常整型数
针 * ;
的)。
)
)
)
.
用保存在寄存器里的备份。
下面是变量的几个例子:
)并行设备的硬件寄存器(如:状态寄存器)
)一个中断服务子程序中会访问到的非自动变量( )
)多线程应用中被几个任务共享的变量回答不出这个问题的人是不会被雇佣的。
我认为这是区分程序员和嵌入式系统程序员的最基本的问题。
嵌入式系统程序员经常同硬件、中断、等等打交道,所用这些都要求变量。
不懂得内容将会带来灾难。
假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得完全的重要性。
)一个参数既可以是还可以是吗?解释为什么。
)一个指针可以是吗?解释为什么。
)下面的函数有什么错误: ( *) { * * *; }
下面是答案:
)是的。
一个例子是只读的状态寄存器。
它是因为它可能被意想不到地改变。
它是因为程序不应该试图去修改它。
)是的。
尽管这并不很常见。
一个例子是当一个中服务子程序修该一个指向一个的指针时。
)这段代码的有个恶作剧。
这段代码的目的是用来返指针*指向值的平方,但是,由于*指向一个型参数,编译器将产生类似下面的代码: ( *) { ; *; *; * ; } 由于*的值可能被意想不到地该变,因此和可能是不同的。
结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
.
)用。
因此
操作。
.
任务。
一个较晦涩的方法是:
*( * )() ;
.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准支持中断。
具代表事实是,产生了一个新的关键字。
下面的代码就使用了关键字去定义了一个中断服务
子程序(),请评论一下这段代码的。
( )
{ * * ;
(" ", ); ; }
这个函数有太多的错误了,以至让人不知从何说起了:
) 不能返回一个值。
如果你不懂这个,那么你不会被雇用的。
) 不能传递参数。
如果你没有看到这一点,你被雇用的机会等同第一项。
)在许多的处理器编译器中,浮点一般都是不可重入的。
有些处理器编译器需要让额处的寄存器入栈,有些处理器编译器就是不允许在中做浮点运算。
此外,应该是短而有效率的,在中做浮点运
算是不明智的。
). 与第三点一脉相承,()经常有重入和性能上的问题。
如果你丢掉了第三和第四点,我不会太为难你的。
不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。
. 下面的代码输出是什么,为什么?
()
{ ;
;
的结果大于。
这
.
;
;
.
要些。
. 在语言中频繁用以声明一个已经存在的数据类型的同义字。
也可以用预处理器做类似的事。
例如,思考一下下面的例子:
* * ;
以上两种情况的意图都是要定义和作为一个指向结构指针。
哪种方法更好呢?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。
答案是:更好。
思考下面的例子: ; ; 第一个扩展为 * , ; 上面的代码定义为一个指向结构的指,为一个实际的结构,这也许不是你想要的。
第二个例子正确地定义了和两个指针。
. 语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
, , ;
;
这个问题将做为这个测验的一个愉快的结尾。
不管你相不相信,上面的例子是完全合乎语法的。
问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。
因此,上面的代码被处理成: ; 因此, 这段代码持行后 , , 。
如果你知道答案,或猜出正确答案,做得好。
如果你不知道答案,我也不把这个当作问题。
我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。