鱼C论坛

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

[已解决]关于宏定义函数

[复制链接]
发表于 2023-9-18 22:40:44 | 显示全部楼层 |阅读模式

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

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

x
函数目的:对给定数组,求其中最小值

以下是宏定义程序:
  1. #include <stdio.h>
  2. #define min(a,b) a>=b?b:a
  3. #define length 10
  4. //int min(int a, int b);
  5. //求最小值
  6. int main()
  7. {
  8.         int temp1=1000,temp2=999,i;
  9.         int arr[length]{5,21,96,8,42,61,345,14,96,45};

  10.         for(i=1;i<=length-1;i++)
  11.         {
  12.                 //printf("debug1:%d\n", min(arr[i], arr[i - 1]));
  13.                 if (min(arr[i], arr[i - 1]) == arr[i])
  14.                 {
  15.                         temp1 = arr[i];
  16.                         printf("debug/1:%.3d    ", temp1);
  17.                 }
  18.                 else
  19.                 {
  20.                         temp1 = arr[i - 1];
  21.                         printf("debug/2:%.3d    ", temp1);
  22.                 }
  23.                 temp2 = min(temp1, temp2);
  24.                 printf("debug/3:temp1:%.3d    temp2:%.3d\n",temp1,temp2);
  25.         }

  26.         printf("result:%d", temp2);
  27.         return 0;
  28. }

  29. /*int min(int a, int b)
  30. {
  31.         return(a >= b ? b : a);
  32. }
  33. */
复制代码


对应输出:
  1. debug/1:021    debug/3:temp1:021    temp2:021
  2. debug/1:096    debug/3:temp1:096    temp2:021
  3. debug/1:008    debug/3:temp1:008    temp2:008
  4. debug/1:042    debug/3:temp1:042    temp2:008
  5. debug/1:061    debug/3:temp1:061    temp2:008
  6. debug/1:345    debug/3:temp1:345    temp2:008
  7. debug/1:014    debug/3:temp1:014    temp2:008
  8. debug/1:096    debug/3:temp1:096    temp2:008
  9. debug/1:045    debug/3:temp1:045    temp2:008
  10. result:8
复制代码


下面是用函数处理的版本:
  1. #include <stdio.h>
  2. //#define min(a,b) a>=b?b:a
  3. #define length 10
  4. int min(int a, int b);
  5. //求最小值
  6. int main()
  7. {
  8.         int temp1=1000,temp2=999,i;
  9.         int arr[length]{5,21,96,8,42,61,345,14,96,45};

  10.         for(i=1;i<=length-1;i++)
  11.         {
  12.                 //printf("debug1:%d\n", min(arr[i], arr[i - 1]));
  13.                 if (min(arr[i], arr[i - 1]) == arr[i])
  14.                 {
  15.                         temp1 = arr[i];
  16.                         printf("debug/1:%.3d    ", temp1);
  17.                 }
  18.                 else
  19.                 {
  20.                         temp1 = arr[i - 1];
  21.                         printf("debug/2:%.3d    ", temp1);
  22.                 }
  23.                 temp2 = min(temp1, temp2);
  24.                 printf("debug/3:temp1:%.3d    temp2:%.3d\n",temp1,temp2);
  25.         }

  26.         printf("result:%d", temp2);
  27.         return 0;
  28. }

  29. int min(int a, int b)
  30. {
  31.         return(a >= b ? b : a);
  32. }
复制代码


下面是对应输出:
  1. debug/2:005    debug/3:temp1:005    temp2:005
  2. debug/2:021    debug/3:temp1:021    temp2:005
  3. debug/1:008    debug/3:temp1:008    temp2:005
  4. debug/2:008    debug/3:temp1:008    temp2:005
  5. debug/2:042    debug/3:temp1:042    temp2:005
  6. debug/2:061    debug/3:temp1:061    temp2:005
  7. debug/1:014    debug/3:temp1:014    temp2:005
  8. debug/2:014    debug/3:temp1:014    temp2:005
  9. debug/1:045    debug/3:temp1:045    temp2:005
  10. result:5
复制代码


问题:
为什么第一个程序跑不对,第二个程序跑得对?

求大佬解答
最佳答案
2023-9-18 22:40:54
第一个程序的问题在于宏定义函数中的参数不是常量,而是变量,导致在使用时会出现问题。例如在第一个程序中,当执行min(arr[ i], arr[i-1])时,实际上会被展开为arr[ i]>=arr[i-1]?arr[i-1]:arr[ i],这样就会出现问题,因为arr[ i]和arr[i-1]都是变量,展开后的结果可能不是我们期望的。而第二个程序中使用的是函数,参数是常量,不存在这个问题,所以结果是正确的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-18 22:40:54 | 显示全部楼层    本楼为最佳答案   
第一个程序的问题在于宏定义函数中的参数不是常量,而是变量,导致在使用时会出现问题。例如在第一个程序中,当执行min(arr[ i], arr[i-1])时,实际上会被展开为arr[ i]>=arr[i-1]?arr[i-1]:arr[ i],这样就会出现问题,因为arr[ i]和arr[i-1]都是变量,展开后的结果可能不是我们期望的。而第二个程序中使用的是函数,参数是常量,不存在这个问题,所以结果是正确的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-18 22:56:37 | 显示全部楼层
isdkz 发表于 2023-9-18 22:40
第一个程序的问题在于宏定义函数中的参数不是常量,而是变量,导致在使用时会出现问题。例如在第一个程序中 ...

感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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