一道C面试题的思考

2024-06-22 09:08
文章标签 面试题 思考 一道

本文主要是介绍一道C面试题的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

C语言真的是学无止境的感觉,大部分同学大学都会开设C语言课程。很多人把C语言二级过了就感觉入门了;对于那些在做嵌入式开发的工程师,几乎每天都要接触C语言,很多人会感觉自己C语言学得很溜了。那好,咱们用一道C语言面试题来测试一下。

二、面试题

首先给出题目:
定义一个宏,求两个数中的最大数

OK,很多人应该能很快写出

#define  MAX(x,y)  x > y ? x : y

接下来我们写一个测试程序

#define MAX(x,y) x > y ? x : y
int main(void)
{printf("max=%d",MAX(1,3)); //测试通过printf("max=%d",MAX(4,1));//测试通过printf("max=%d",MAX(2,2));//测试通过printf("max=%d",MAX(3!=3,1!=2)); //好像不是我们要的结果return 0;
}

我们会发现第四个测试不是我们的要结果了。这是因为宏展开后,就变成了这个样子:

printf("max=%d",3!=3>1!=2?3!=3:1!=2);

这个时候大于号(>)的优先级更高,所以就出现了问题了。

优化上面的代码

可能很多人已经想到了解决方法了,比较有经验的工程师基本也比较少犯上面的错误。
加上括号就可以解决上面的问题了。

#define MAX(x,y) (x) > (y) ? (x) : (y)

OK,接下来我们再写一个测试程序

#define MAX(x,y) (x) > (y) ? (x) : (y)
int main(void)
{printf("sum =%d", 7 + MAX(3,4));return 0;
}

运行结果:
在这里插入图片描述
并不是我们所期望的11。我们将其展开后为:

7 + (3) > (4) ? (3) : (4);

这个时候加号(+)的优先级又比大于号(>)高,所以就出现了这种结果。

那我们就继续加个括号

#define MAX(x,y) ((x) > (y) ? (x) : (y))

到这里算是比较完整的了,在面试中要是能写出这个,那算基本功还是比较扎实的了。

那我们再写一个测试程序

#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void)
{int i = 3;int j = 4;printf("max=%d",MAX(i++,j++));return 0;
}

运行结果:
在这里插入图片描述
这里面的j会做两次自增运算, 所以打印出来的结果是做了一次自增后的结果。

继续优化

#define MAX(type,x,y)({     \type _x = x;        \type _y = y;        \_x > _y ? _x : _y; \
})
int main(void)
{int i = 4;int j = 5;printf("max=%d\n",MAX(int,i++,j++));printf("max=%f\n",MAX(float,3.2,3.4));return 0;
}

到这里基本算比较完美了!是不是很折腾, 程序的bug就是这样一步一步修复的过程。

三、总结

如果你能一下就写出最后的代码,那说明你确实是666了,通过上面的一步一步分析是为了告诉大家,C语言真的有很多东西可以让我们去琢磨!我们也还有很长的路要走。

欢迎大家关注我的微信公众号!!

这篇关于一道C面试题的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083861

相关文章

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

【SparkStreaming】面试题

Spark Streaming 是 Apache Spark 提供的一个扩展模块,用于处理实时数据流。它使得可以使用 Spark 强大的批处理能力来处理连续的实时数据流。Spark Streaming 提供了高级别的抽象,如 DStream(Discretized Stream),它代表了连续的数据流,并且可以通过应用在其上的高阶操作来进行处理,类似于对静态数据集的操作(如 map、reduce、

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框架爬取。 我对此图的理解就是: 从spiders中获得一个请求(REQUEST),通过引擎传递给调度器,之后再返回给引擎,引擎把url封装好后传递给下载器,下载器将资源下载好后

C语言常见面试题3 之 基础知识

(1)i++和++i哪个效率更高? 对于内建数据类型,二者效率差别不大(去除编译器优化的影响) 对于自定义数据类型(主要是类),因为前缀式(++i)可以返回对象的引用;而后缀式(i++)必须返回对象的值,所以导致在大对象时产生了较大的复制开销,引起效率降低。 (2)不使用任何中间变量如何交换a b的值? void swap(int& a, int& b)//采用引用传参的方式{a^=

关于微信没有接入鸿蒙NEXT的思考

6月21日,纯血鸿蒙发布,国内的质疑声终于停止,不再被人喊叫换皮 Android 了.就连编程语言都是华为自研的。 可是发布会后微信却成了热点,因为余承东在感谢了一圈互联网企业,如:淘宝、支付宝、美团、京东、抖音、今日头条、钉钉、小红书、微博、B站、高德、WPS等等. 唯独没有感谢腾讯. 中国互联网巨头只有哪么几家,腾讯、阿里、字节、拼多多、美团、百度、京东、华为 他们这些派系又诞生了无数

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim

面试题3:GET 和 POST 有什么区别?

[!]高频面试题。 GET 和 POST 没有本质区别,可以进行相互代替。 1、GET语义:“从服务器获取数据”;POST语义:“往服务器上提交数据”。[设计初衷,不一定要遵守] 2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。不过比较少见,以至于浏览器不一定能支持,不过其他的http客户端可以支持;POST 一般是放在 body 中