【问题标题】:How are arguments passed in small brackets processed in C? [duplicate]在 C 中如何处理小括号中传递的参数? [复制]
【发布时间】: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 会导致未定义的行为。如果您传递给许多参数,多余的参数将被评估然后丢弃。

标签: c


【解决方案1】:

关于operator precedence
在 (x,y) 的情况下,对 () 中的第一条语句求值,因此最后一个值 y 将作为 () 的结果。没有 () 所有逗号运算符的优先级相同,因此评估从左到右进行,因此 printf() 采用 x 值

【讨论】:

    【解决方案2】:

    括号使(x, y) 成为一个表达式,由xycomma operator 组成。运算符计算 x,将值丢弃,计算 y,并将其作为表达式的值。

    由于评估变量x没有副作用,本例中的表达式(x, y)等价于自己传递的y

    printf ("%d\n", y);
    

    注意:如果您的第一个 printf 使用 "%d %d" 格式字符串,您将看到 xy

    【讨论】:

      【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-04
          • 1970-01-01
          • 1970-01-01
          • 2021-06-04
          • 2016-05-21
          • 1970-01-01
          • 2017-04-01
          相关资源
          最近更新 更多