回 帖 发 新 帖 刷新版面

主题:[讨论]最“二?”C语言宏问题

[code=c]
#include<stdio.h>
#include<conio.h>
#include<string.h>

/***********************************************************
  返回最长字符串
***********************************************************/
#if 1

#define MAX_LEN(a, b)   ((sizeof(a) >= sizeof(b)) ? (a):(b))

#else

char *MAX_LEN(char *a, char *b)
{
    return (((strlen(a) >= strlen(b)) ? (a):(b)));
}
#endif

int main (void)
{
    printf("             sizeof(\"VC\")->  %d\r\n\
             sizeof(\"Java\")->  %d\r\n\
             sizeof(\"C++\")-> %d\r\n\
             sizeof(\"JavaScript\")->   %d\r\n",
             sizeof("VC"),
             sizeof("Java"),
             sizeof("C++"),
             sizeof("JavaScript"));

    printf(" %s\r\n", MAX_LEN("VC", "Java"));   
    printf(" %s\r\n", MAX_LEN(MAX_LEN("VC", "Java"), "C++"));
    printf(" %s\r\n", MAX_LEN(MAX_LEN(MAX_LEN("VC", "Java"), "C++"), "JavaScript"));

    printf(" %s\r\n", MAX_LEN(MAX_LEN("3jia1", "jxust"), "www.jxust3jia1.com"));
    printf(" %s\r\n", MAX_LEN(MAX_LEN(MAX_LEN("3jia1", "jxust"), "www.jxust3jia1.com"), "JavaScript"));

    _getch();
    return 0;
}
[/code]
运行结果为:
             sizeof("VC")->  3
             sizeof("Java")->  5
             sizeof("C++")-> 4
             sizeof("JavaScript")->   11
Java
Java
JavaScript
www.jxust3jia1.com
JavaScript                           ->这个的结果不是应该为www.jxust3jia1.com吗?

如果切换成函数(即把上面代码中的#if 1 改成#if 0),最后显示的字符串就是www.jxust3jia1.com,但使用函数效率低,占用CPU运行时间。而使用宏则是由编译器来完成上面的运行,不用每次运行程序时都需要计算,大大提高了效率,可却出现了上面的问题了?????

请高手帮忙解释一下上述的宏情况,谢谢!

回复列表 (共1个回复)

沙发

对于 (判断条件 ? 类型1的变量 : 类型2的变量) 的类型,你认为是什么?

所以 MAX_LEN("123", "12345") 的类型不是 char[6],而是 const char*
所以 MAX_LEN( MAX_LEN("123","12345"), "1234" )
化解开来就是 sizeof((const char*)"12345")>=sizeof("1234") : (const char*)"12345" : "1234"

我来回复

您尚未登录,请登录后再回复。点此登录或注册