gpt4 book ai didi

C 奇怪的宏语法

转载 作者:太空狗 更新时间:2023-10-29 16:26:43 25 4
gpt4 key购买 nike

我找到了这个 C 代码示例,我非常困惑:

#include <stdio.h>
#define M(a,b) a%:%:b

main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", M(a,b)<:a:> );
printf( "%d", M(a,b)<:a:>?a:b );
printf( "%d", c=M(a,b)<:a:>?a:b );
}

有人可以解释一下这应该做什么吗?它甚至没有在 Visual Studio 中编译,但我在线运行它(在 ideone.com 上)并打印了 2011,这也增加了困惑。

最佳答案

它正在利用 C digraphs这是 1994 年对 C 标准的修订,因此是 C99 标准的一部分。用实际字符交换二合字母,你会得到:

#include <stdio.h>
#define M(a,b) a##b

main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", M(a,b)[a] );
printf( "%d", M(a,b)[a]?a:b );
printf( "%d", c=M(a,b)[a]?a:b );
}

因此,请记住 a##b 会将输入合并为一个标识符。由于宏只是传递了 ab,结果只是 ab,所以你实际上有:

main()
{
int a=1, b=2, ab[]={10,20}, c;
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", c=ab[a]?a:b );
}

c 的赋值并不是真正相关的,所以我们可以去掉它:

main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", ab[a]?a:b );
printf( "%d", ab[a]?a:b );
}

现在,让我们摆脱三元运算符 (?:),因为我们可以静态地解决它(ab[a] 始终为真,因为 a 为 1 而 ab[1] 为 20,即非零):

main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", ab[a] );
printf( "%d", a );
printf( "%d", a );
}

现在,用它们的实际值替换变量,即 ab[a] 替换为 20a 替换为 1

main()
{
int a=1, b=2, ab[]={10,20};
printf( "%d", 20 );
printf( "%d", 1 );
printf( "%d", 1 );
}

关于C 奇怪的宏语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36973065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com