C语言中类似宏的不可理解函数

C语言中类似宏的不可理解函数,c,function,macros,C,Function,Macros,我有一个c宏代码: #define d(x, y, z) ( \ x += z, \ y += x, \ x += y \ ) 我有几个问题: 这个宏函数会返回什么吗?(例如,返回x、y或z) 或者它只是将参数变量与自身相加?(这是 我觉得没用) \是什么意思 为什么原始编码器在每次操作后都使用逗号运算符?为什么不直接使用而不是, 任何帮助都将不胜感激 这个宏函数会

我有一个c宏代码:

#define d(x, y, z) (    \
      x += z,               \
      y += x,               \
      x += y                \

)
我有几个问题:

  • 这个宏函数会返回什么吗?(例如,返回x、y或z) 或者它只是将参数变量与自身相加?(这是 我觉得没用)
  • \
    是什么意思
  • 为什么原始编码器在每次操作后都使用
    逗号运算符
    ?为什么不直接使用
    而不是
  • 任何帮助都将不胜感激

    这个宏函数会返回什么吗?(例如,返回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!!!
    
    这个宏函数会返回什么吗?(例如,返回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通常不是一个好主意