代码之家  ›  专栏  ›  技术社区  ›  Karim Manaouil

函数参数中的逗号运算符

  •  -2
  • Karim Manaouil  · 技术社区  · 8 年前

    我正在阅读GNU C手册的摘录:

    使用逗号运算符分隔两个(表面上相关的)表达式。

    在后面的描述中:

    如果要在函数参数中使用逗号运算符,则需要 用括号括起来。这是因为函数中的逗号 参数列表有不同的含义:它们分隔参数。

    直到现在,一切都很好。奇怪的是:

    foo (x, (y=47, x), z); 是一个只有三个的函数调用 论据。(第二个论点是 (y=47, x) .)

    问题是:如何将参数推送到堆栈上,如何从函数中访问它?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Sourav Ghosh    8 年前

    就你而言,

      foo (x, (y=47, x), z);
    

    功能类似于

      foo (x, x, z);
    

    根据逗号运算符的属性,对LHS操作数求值并丢弃结果,然后对RHS操作数求值,这就是结果。

    为了完成,引用 C11 ,第§6.5.17章

    逗号运算符的左操作数计算为空表达式;有一个 其求值和右操作数求值之间的序列点。然后是右边 计算操作数;结果有其类型和价值。

    注意:变量 y 将更新,因为LHS操作数作为void表达式计算,但对 此函数调用 . 在这种情况下 y 是全局变量,用于 foo() 函数,它将看到的初始值为 47 .

    也就是说,回答

    参数是如何推送到堆栈上的

    非常依赖于实现(架构)。C没有为函数参数传递指定任何顺序,一些架构可能根本不使用“堆栈”来传递函数参数!!

    推荐文章