宏新手程序员

Macros Rookie Programmer

本文关键字:程序员 新手      更新时间:2023-10-16

我有一个实验室类,这是一个问题,有人能纠正这个程序吗?它运行正常,但当它的输出错误时。它基本上必须打印三个条件中最小的一个,问题是:

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

这是我写的代码,它有两个错误代码没有效果,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;
}

请帮我,我很快就要考试了,对此我将不胜感激。

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

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("%dn", minimum3(2, 3, 4));
    printf("%dn", minimum3(3, 4, 2));
    return 0;
}

输出:

2
2

首先,宏不是函数,而是文本替换。如果宏要生成两个数值中的最小值,它应该生成数值,而不是某些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++函数来接受变量。

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

以及我们的课程,您需要输出您的结果:

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