鱼C论坛

 找回密码
 立即注册
查看: 711|回复: 2

[已解决]求助一下

[复制链接]
发表于 2023-11-16 11:09:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#define  MIN(x,y)  (x<y)?x:y
int main()
{
   int i,j,k;
   i=10;j=15;
   k=10*MIN(i,j);
   printf("%d\n",k);
   return 0;
}


这段代码结果为什么不是100而是10
最佳答案
2023-11-16 11:09:35
这是因为在宏定义中, MIN(x,y) (x<y)?x:y 存在一个问题。宏定义中的条件表达式没有使用括号括起来,导致了优先级问题。在这个宏定义中,宏展开后的表达式为 k=10*(i<j)?i:j 。由于 * 运算符的优先级高于 ? : 条件运算符,所以实际上这个表达式被解释为 k=(10*(i<j))?i:j 。而 10*(i<j) 的值为0,因为 (i<j) 为真,所以整个表达式的值为0。因此, k 的值为0乘以 MIN(i,j) ,即为10。

要修复这个问题,需要在宏定义中加上括号来明确运算的优先级,如下所示:
  1. #define MIN(x,y) ((x)<(y)?(x):(y))
复制代码

这样就能正确地计算出 k 的值为100。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-16 11:09:35 | 显示全部楼层    本楼为最佳答案   
这是因为在宏定义中, MIN(x,y) (x<y)?x:y 存在一个问题。宏定义中的条件表达式没有使用括号括起来,导致了优先级问题。在这个宏定义中,宏展开后的表达式为 k=10*(i<j)?i:j 。由于 * 运算符的优先级高于 ? : 条件运算符,所以实际上这个表达式被解释为 k=(10*(i<j))?i:j 。而 10*(i<j) 的值为0,因为 (i<j) 为真,所以整个表达式的值为0。因此, k 的值为0乘以 MIN(i,j) ,即为10。

要修复这个问题,需要在宏定义中加上括号来明确运算的优先级,如下所示:
  1. #define MIN(x,y) ((x)<(y)?(x):(y))
复制代码

这样就能正确地计算出 k 的值为100。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-16 11:10:12 | 显示全部楼层
非代码区

问题分析:

这段代码中使用了宏定义来创建一个取较小值的宏 MIN(x, y),但在结果中却出现了预期之外的输出。让我们来看看可能的原因。

回答:

问题出在宏定义展开时缺少了括号。在宏定义中,缺少括号可能导致运算顺序不符合预期,进而导致错误的结果。

在这段代码中,宏定义应该加上括号,如下所示:
  1. #define MIN(x,y) ((x<y)?(x):(y))
复制代码

这样,宏展开后就会得到正确的结果。修改后的代码如下:
  1. #include <stdio.h>
  2. #define MIN(x,y) ((x<y)?(x):(y))
  3. int main()
  4. {
  5.    int i,j,k;
  6.    i=10;j=15;
  7.    k=10*MIN(i,j);
  8.    printf("%d\n",k);
  9.    return 0;
  10. }
复制代码

运行修改后的代码,结果将会是100,符合预期。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 01:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表