Macros Rookie程序员

时间:2012-02-10 21:15:59

标签: c++

我有一个实验课,这是一个问题,可以有人纠正这个程序/它运行正确,但当它的输出是错误的。它基本上必须打印三个条件中最小的一个,这是问题:

  

编写定义宏minimum2的程序,以确定两个数值中较小的一个。然后使用最小值2来比较应该定义名称最小值为3的第三个宏来确定最小数量。

这是我写的代码,它有两个错误代码没有效果,e分配一个从未使用过的值:

#include <stdio.h>
#include <conio.h>

#define minimum2(a,b)(a < b)?a:b
#define minimum3(a,b,c) minimum2(a,b) < c? minimum2(a,b):c

int main()
{
   int  c = 3, d = 4, e = 2;
   minimum3(c, d, e);
   getch();
   return 0;
}

请帮助我,我很快就会参加考试,并对此感激不尽。

4 个答案:

答案 0 :(得分:5)

  1. 您的宏定义中需要更多括号。
  2. 您需要以某种方式使用 minimum3操作的结果。

答案 1 :(得分:2)

minimum2(a,b)(a < b) ? a : b取代,这意味着你应该:

  • 将括号放在第一个宏的定义中,如下所示:
    #define minimum2(a,b) ((a < b) ? a : b)

  • 或者将它们放在你称之为minimum2的任何地方: #define minimum3(a,b,c) (minimum2(a,b)) < c ? (minimum2(a,b)) : c

这是第一个提到的选项并且工作正常:

#include <stdio.h>

#define minimum2(a,b) ( (a < b) ? a : b )
#define minimum3(a,b,c) minimum2(a,b) < c ? minimum2(a,b) : c

int main()
{
    printf("%d\n", minimum3(2, 3, 4));
    printf("%d\n", minimum3(3, 4, 2));
    return 0;
}

输出:

2
2

答案 2 :(得分:0)

首先,宏不是函数,它们是文本替换。如果一个宏要产生两个数值的min,它应该产生数值而不是一些C ++表达式。

其次,最简单的方法是使用Boost.Preprocessor

#define minimum2(a,b) BOOST_PP_IF(BOOST_PP_LESS(a,b), a, b)
#define minimum3(a,b,c) minimum2(minimum2(a,b), c) 

这将接受从0到256的文字数字。它不接受变量。宏不理解变量。你必须编写C ++函数来接受变量。

答案 3 :(得分:-2)

 #define minimum2(a,b)((a) < (b))?(a):(b)
 #define minimum3(a,b,c) minimum2((a),(b)) < (c)? minimum2((a),(b)):(c)

我们当然需要输出结果:

printf("m3:%d\n", minimum3(c, d, e));