C语言中类似宏的不可理解函数
我有一个c宏代码:C语言中类似宏的不可理解函数,c,function,macros,C,Function,Macros,我有一个c宏代码: #define d(x, y, z) ( \ x += z, \ y += x, \ x += y \ ) 我有几个问题: 这个宏函数会返回什么吗?(例如,返回x、y或z) 或者它只是将参数变量与自身相加?(这是 我觉得没用) \是什么意思 为什么原始编码器在每次操作后都使用逗号运算符?为什么不直接使用而不是, 任何帮助都将不胜感激 这个宏函数会
#define d(x, y, z) ( \
x += z, \
y += x, \
x += y \
)
我有几个问题:
\
是什么意思逗号运算符
?为什么不直接使用代码>而不是,
x
的最终值
\是什么意思
当最后放置在一行上时,它将否定换行符,以便宏定义可以跨越多行
为什么原始编码器在每次操作后都使用逗号运算符?为什么不直接使用代码>而不是“,?”
宏替换文本。考虑下面的代码:
int x=1, y=2, z=3, f;
f = 3 * (d(x,y,z));
如果宏使用逗号,则代码变为:
int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y); // Evaluates to 3 * (the final value of x)
int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y); // Syntax error!!!
如果宏使用分号,则代码变为:
int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y); // Evaluates to 3 * (the final value of x)
int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y); // Syntax error!!!
这个宏函数会返回什么吗?(例如,返回x、y或z)还是只添加参数变量本身?(我想这是没用的)
它修改变量的值。“返回”值是x
的最终值
\是什么意思
当最后放置在一行上时,它将否定换行符,以便宏定义可以跨越多行
为什么原始编码器在每次操作后都使用逗号运算符?为什么不直接使用代码>而不是“,?”
宏替换文本。考虑下面的代码:
int x=1, y=2, z=3, f;
f = 3 * (d(x,y,z));
如果宏使用逗号,则代码变为:
int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y); // Evaluates to 3 * (the final value of x)
int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y); // Syntax error!!!
如果宏使用分号,则代码变为:
int x=1, y=2, z=3, f;
f = 3 * (x+=z, y+=x, x+=y); // Evaluates to 3 * (the final value of x)
int x=1, y=2, z=3, f;
f = 3 * (x+=z; y+=x; x+=y); // Syntax error!!!
1) 宏本身不返回任何内容。它只是一段愚蠢的代码,无论在哪里遇到它,都会被预处理器逐字替换。它可以是任何类型的文本
2) \用于让预处理器知道当前宏也会扩展到下一行。(多行宏)
3) 我不能对原始编码者的意图做出任何假设。但是,通过在其中使用逗号运算符,整个宏将变成一个C语言表达式。例如,运行类似这样的东西是有效的(如果分号在里面就不行了):
和打印:
a = 10
x = 10
y = 6
z = 3
1) 宏本身不返回任何内容。它只是一段愚蠢的代码,无论在哪里遇到它,都会被预处理器逐字替换。它可以是任何类型的文本
2) \用于让预处理器知道当前宏也会扩展到下一行。(多行宏)
3) 我不能对原始编码者的意图做出任何假设。但是,通过在其中使用逗号运算符,整个宏将变成一个C语言表达式。例如,运行类似这样的东西是有效的(如果分号在里面就不行了):
和打印:
a = 10
x = 10
y = 6
z = 3
首先也是最重要的一点是,define是一个预处理器指令,这意味着当源代码/c代码被遵守时,define将LHS替换为RHS-这意味着无论何时使用d(x,y,z)都将替换为给定的等式
例如,下面的c代码将打印-修改后的a=9、b=8、c=9
#define d(x,y,z) \
x+=1, \
y+=2, \
z+=3
#include <stdio.h>
int main()
{
unsigned int a,b,c;
a=5;
b=6;
c=7;
printf("modified a = %d, b=%d, c=%d \n",d(a,b,c));
}
定义d(x,y,z)\
x+=1\
y+=2\
z+=3
#包括
int main()
{
无符号整数a,b,c;
a=5;
b=6;
c=7;
printf(“修改的a=%d,b=%d,c=%d\n”,d(a,b,c));
}
基本上这里发生的是d(a,b,c)-被a+=1,b+=2,c+=3替换
\的含义是预处理器指令在下一行中继续李>
至于逗号运算符,我们需要查看源代码以了解它的确切用法。正如您在上面的代码中所看到的,逗号运算符实际上分隔了所有三个变量,并且能够正确打印-如果我用任何其他运算符替换逗号,我们将得到编译错误
希望这能回答你的问题:)
问候
Hari首先,define是一个预处理器指令,这意味着当源代码/c代码被遵守时,define将LHS替换为RHS-这意味着无论使用哪一个d(x,y,z)都将被给定的等式替换
例如,下面的c代码将打印-修改后的a=9、b=8、c=9
#define d(x,y,z) \
x+=1, \
y+=2, \
z+=3
#include <stdio.h>
int main()
{
unsigned int a,b,c;
a=5;
b=6;
c=7;
printf("modified a = %d, b=%d, c=%d \n",d(a,b,c));
}
定义d(x,y,z)\
x+=1\
y+=2\
z+=3
#包括
int main()
{
无符号整数a,b,c;
a=5;
b=6;
c=7;
printf(“修改的a=%d,b=%d,c=%d\n”,d(a,b,c));
}
基本上这里发生的是d(a,b,c)-被a+=1,b+=2,c+=3替换
Hari顺便说一句,这段代码很糟糕,如果你想使用它,它会增加很多错误。试着猜测
int a=1,b=2,c=3,d=4的结果代码>和inta=1;intb=d(1,a,3)代码>?“C语言中可理解的宏”是一种矛盾修饰法。使用逗号运算符和周围的()
使整个事情成为一个简单的语句,这意味着宏可以放在if
(sans{}
)后面,而不用担心它会导致一个损坏的if
子句。使用{}
也可以,但我隐约记得,在某些情况下,()
更好。是的,正如@BryanChen所指出的,宏修改其一个ope通常不是一个好主意