在 C 中如何处理小括号中传递的参数? [复制]
Posted
技术标签:
【中文标题】在 C 中如何处理小括号中传递的参数? [复制]【英文标题】:How are arguments passed in small brackets processed in C? [duplicate] 【发布时间】:2014-03-10 17:57:29 【问题描述】:对于以下代码:
int main(void)
int x = 1000, y = 5000;
printf ("%d\n", x, y);
printf ("%d\n", (x, y));
return 0;
输出: 1000 5000
有人可以解释一下吗?
【问题讨论】:
2 个问题的重复。 @AntonH:未定义的行为如何?将少量参数传递给printf
会导致未定义的行为。如果您传递给许多参数,多余的参数将被评估然后丢弃。
【参考方案1】:
关于operator precedence
。
在 (x,y) 的情况下,对 () 中的第一条语句求值,因此最后一个值 y 将作为 () 的结果。没有 () 所有逗号运算符的优先级相同,因此评估从左到右进行,因此 printf() 采用 x 值
【讨论】:
【参考方案2】:括号使(x, y)
成为一个表达式,由x
和y
和comma operator 组成。运算符计算 x
,将值丢弃,计算 y
,并将其作为表达式的值。
由于评估变量x
没有副作用,本例中的表达式(x, y)
等价于自己传递的y
:
printf ("%d\n", y);
注意:如果您的第一个 printf
使用 "%d %d"
格式字符串,您将看到 x
和 y
。
【讨论】:
【参考方案3】:对于第一个 printf,您只是传递了被忽略的第二个参数。
对于第二个,您正在调用逗号运算符,它计算它的两个参数,并返回第二个的值。
【讨论】:
【参考方案4】:您在这里看到的是 C 逗号运算符的求值。http://en.wikipedia.org/wiki/Comma_operator
很少使用的逗号运算符经常在for()
循环的第三部分中使用,以对增量执行多项操作,但从技术上讲,它在任何地方都是有效的表达式。
【讨论】:
宏定义中也常用。【参考方案5】:在函数 printf 的第一次调用中,参数的数量超过了格式字符串中格式说明符的数量
printf ("%d\n", x, y);
在这种情况下,第二个参数 y 将被忽略。只会输出 x。所以调用的输出是
1000
在函数 printf 的第二次调用中,只有一个参数是括号中的表达式。
printf ("%d\n", (x, y));
此表达式是逗号运算符的表达式。首先,对第一个操作数 x 求值。它的值被忽略。然后计算表达式的第二个操作数 y。它的值用作完整表达式的结果。所以这个函数调用输出
5000
【讨论】:
以上是关于在 C 中如何处理小括号中传递的参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章