【发布时间】:2018-03-21 23:24:36
【问题描述】:
我正在阅读 GNU C 手册的摘录:
您使用逗号运算符来分隔两个(表面上相关的)表达式。
后面的描述:
如果你想在函数参数中使用逗号操作符,你需要 在它周围加上括号。那是因为函数中的逗号 参数列表具有不同的含义:它们分隔参数。
到目前为止,一切都很好。奇怪的是:
foo (x, (y=47, x), z);是一个函数调用,只有三个 论据。 (第二个参数是(y=47, x)。)
问题是:参数是如何压栈的,如何从函数内部访问它?
【问题讨论】:
-
函数接收参数 (x, x, z)。问题出在哪里?
-
参数不必被压入堆栈。堆栈甚至可能不存在
-
据我所知,问题在于 OP 正在想象整个带括号的构造被“推入”堆栈/作为参数传递。错过了首先评估这一点。
-
a) 这不是 GNU 扩展,而是标准 C 行为,b) 确实不需要堆栈,并且在 x86-64 中,参数甚至不会被压入堆栈,参数是正如苏拉夫所说...
-
评估三个参数中的每一个,并将结果传递给函数。请记住,C 是按值调用,而不是按名称调用(您认为它的行为方式与 Algol 中的行为方式相同)。
标签: c arguments expression comma-operator