问题描述
使用条件编译指令编写一个程序,将数字 56 舍入到最接近的 50。
预期输出:50
错在哪里?
#include <iostream>
using namespace std;
#define R 50
int main()
{
int Div;
Div = R % 50;
cout<<"Div:: "<<Div;
printf("\n");
#if(Div<=24)
{
int Q;
printf("Rounding down\n");
Q =(int(R /50))*50;
printf("%d",Q);
}
#else
{
int Q;
printf("Rounding UP\n");
Q =(int(R/50)+1)*50;
printf("%d",Q);
}
#endif
}
解决方法
Div
是一个变量,因此不能在预处理指令中求值,因为预处理发生在编译源代码之前。
由于预处理器不理解变量,因此在算术表达式中使用它时,它会给 令牌 Div
一个任意值 0
。这意味着您的程序似乎可以工作。但是,如果您将 R
的值更改为 99,您会看到在这种情况下代码不起作用。
没有 Div
的这个版本适用于所有情况。
#define R 50
#if R % 50 <= 24
int Q;
printf("Rounding down\n");
Q =(int(R /50))*50;
printf("%d",Q);
#else
int Q;
printf("Rounding UP\n");
Q =(int(R/50)+1)*50;
printf("%d",Q);
#endif
这是一项非常非常没有意义的任务。即使尝试回答我也感到尴尬。
,解释作业任务的唯一有意义的方法是以 56 为例,并要求任何给定整数的编译时常量结果。 使用条件编译指令的唯一有意义的方法是将负数也考虑在内。
#ifndef NUMBER
#define NUMBER 56
#endif
#if NUMBER < 0
#define ROUNDED (NUMBER-25)/50*50
#else
#define ROUNDED (NUMBER+25)/50*50
#endif