【问题标题】:C/C++ Macro for finding maximum of two numbers without using ternary operatorC/C++ 宏,用于在不使用三元运算符的情况下查找最多两个数字
【发布时间】:2014-11-13 14:15:35
【问题描述】:

我遇到了一个面试问题,内容如下:

“编写一个简单的 C/C++ 宏来查找最多两个数字,而无需使用标准库或三元运算符”。

我需要你的帮助来解决这个问题。我知道这是微不足道的,但我找不到它。所以,把它贴在这里。

#include<iostream>
#define max(x,y) /*LOGIC HERE*/
using namespace std;

void main()
{
    int a = 98453;
    int b = 66394;  
    cout<<max(a,b);
}

【问题讨论】:

  • 看到这个answer 和这个c++ 代码不会在C++ 中编译compiler.main 应该返回int
  • 请记住,面试也是您确定是否想在该公司工作的一种方式。如果你遇到这样的问题,问几个问题作为回报:这是正常的风格吗?您的工程师知道 C 和 C++ 之间的区别吗?您的代码库中有多少未修复的警告?与实施新功能相比,您花了多少时间从现场修复错误报告?
  • 另一个人在谈论一种叫做C/C++的语言我想知道我是否必须学习那种神秘的语言。为什么不要求可以在 C 和 C++ 上使用的宏而不是谈论 C/C++
  • 给面试官比较好的回复是,这样的宏不应该用,因为sign .vs。无符号并且因为可能存在不同的变量类型。

标签: c++ c c-preprocessor


【解决方案1】:

#define max(x,y) (x+y + abs(x-y))/2 为您提供所需的内容。这是因为abs(x-y) = max(x,y) - min(x,y)。因此,您可以将表达式重写如下

(x + y) + abs(x-y) = max(x,y) + min(x,y) + max(x,y) - min(x,y)
                   = 2*max(x,y)

正如 cmets 中所指出的,使用 abs 可能会违反您所要求的条件。

【讨论】:

  • 您能告诉我们这是如何工作的吗?我想不明白。我学习数学已经太久了。一旦我可以解决我脑海中的微积分问题。但是现在……我老了。
  • abs() 将是一个标准库函数。
【解决方案2】:

使用布尔运算得到 0 或 1,然后将它们相加:

#define max(x,y) (((int)((x)<(y)) * (y)) + ((int)((y)<=(x)) * (x)))

【讨论】:

  • 另一个 +1 用于使用括号,它们应该在宏中使用。
【解决方案3】:
#define max(x, y) x - ((x-y) & ((x-y) >> 31))

这假设 x 和 y 是 32 位的。

这是因为负整数的最高有效位是 1。

因此,如果 x-y 为负数(y 大于 x),则 x - (x - y) = y。

如果 x-y 为正,则 x 大于 y,最高有效位为零,因此 x - 0 = x。

31 代表变量的总位数 - 1。(因此是最高有效位)。

我想这就是他们正在寻找的,因为它不使用比较。

【讨论】:

  • 在 C++ 5.8/3 下,对于E1 &gt;&gt; E2,“如果 E1 有带符号类型和负值,则结果值是实现定义的”。
  • @Tony :有趣的是认为“实现”不会使用 2s-Compliment 来存储负数,但这样的细节是“在幕后”,就像字节序一样。你碰巧有那个文档的链接吗?
  • 似乎链接自 this SO question - 干杯。
【解决方案4】:
#include <iostream>

#define max(x, y) [a = x, b = y](){ if (a<b) return b; else return a; }()

int main() {
    using namespace std;

    int a = 10;
    int b = 20;
    cout << max(10, 20);
    cout << max(a, b);
};

只是为了好玩的解决方案:> 用c++14编译

如果 x, y 有不同的类型会爆炸

【讨论】:

  • 很好,因为它只假设类型是有序的,没有假设算术。 IE。它也适用于前向迭代器。
  • 它实际上看起来像一些假的三元运算符。但我怀疑这是否可以编译。
  • @MichaelWalz:它是一个“lambda”,仅在最近的 C++11 标准中可用。
【解决方案5】:

哇,这么多不错的解决方案。我还有一个利用布尔值转换为零和一的漏洞:

#define CONDITION(c, t, f) (c * t + (1 - c) * f)
#define MAX(a, b) CONDITION(a > b, a, b)

在附近,我故意将这个邪恶的宏机制全部大写。我想说这是你应该在面试中提出的实际观点。

【讨论】:

    【解决方案6】:

    另一种疯狂的仅限 C++11 的方法,并通过额外的 struct 声明稍微作弊(如果允许使用库,可以使用 std::array)——不管它值多少钱(不多!)...

    struct Max { int n_[2]; };
    #define max(x,y) (Max{(x),(y)}.n_[(x) < (y)])
    

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多