【问题标题】:What is this syntax?这是什么语法?
【发布时间】:2010-12-13 14:27:16
【问题描述】:
i = 1, 2, 3, 4, 5;

这实际上将1 分配给i

*****我想知道这种类型的作业是否真的有用?*****

你知道这种语法的一些应用吗?

【问题讨论】:

标签: c syntax variable-assignment


【解决方案1】:

当你想在一个 for 循环中说 2 个迭代变量时,这种语法非常有用

for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
  ..
}

【讨论】:

  • 讨厌不得不继续分发这些,但形而上学 +1 因为我在接下来的两个小时内没有投票。
  • 这可能是我使用过这种语法的唯一情况。每当我在其他地方看到它时,我都会畏缩。
【解决方案2】:

它是逗号运算符,C 的最低优先级运算符。根据 C 的优先规则,该行解析如下:

(i = 1), (2), (3), (4), (5);

如果你想在那一行做其他事情,这可能是“有用的”:

i = 2, j = 3, k++;

可以避免在if() 语句中使用方括号(以后还会引起头痛),或者允许您在for() 循环的控制流中使用多个表达式(这实际上是对逗号运算符的一种非常合理的使用)。

【讨论】:

  • 是的。唯一要补充的是,逗号也常用于将同一类型的多个声明放在同一行:int i, j, cookies=7, width, height;
  • @Benji - 这是一个已经令人困惑的逗号运算符令人困惑的事情之一。那些逗号不是运算符。它们是 C 语法要求的用于 init-declarator-list 中多个声明符的分隔符。其他不是运算符的逗号包括分隔函数参数/参数的逗号以及在定义枚举时分隔枚举的逗号。可能还有其他人。
【解决方案3】:

应用程序:Obfuscated C Contest!

【讨论】:

    【解决方案4】:

    逗号运算符的另一个常见用途是在while 循环条件中:

    while (c = getchar(), c != EOF && c != '\n')
    {
    

    【讨论】:

    • getchar 在任何错误时返回 EOF,因此错误处理代码将在循环之后。
    【解决方案5】:

    这不是“分配类型”。逗号运算符的绑定非常松散,比赋值更松散。所以你写了相当于:

    ((((i = 1), 2), 3), 4), 5;
    

    void 上下文中的整数文字是无用的(除了可能避免在某些情况下不执行任何操作的宏中的警告,例如断言),所以不,完全没有用这种语法 - 需要一个将 i 设置为 1 的表达式并且评估为 5 是非常有限的,即使您找到了一个案例,2,3,4 也是多余的。

    更有用的可能是i = 1, code_that_actually_does_something;。逗号运算符最常见的用途是在不允许多个语句的上下文中潜入多个副作用,例如在“if”和“while”条件中,或者必须作为表达式计算的宏。

    【讨论】:

    • 形而上学 +1,因为我没有投票了(对不起,我保证会回复你)。
    【解决方案6】:

    这是comma operator,它允许您将多个表达式组合为一个。

    编译器将其解析为(i = 1), 2, 3, 4, 5,因为= 的优先级高于逗号运算符。

    除了在for 循环中,它通常没有用处,而且它的使用是不受欢迎的。

    【讨论】:

      【解决方案7】:

      在作业中,我想不出这个特定示例的用处。

      你可以这样做

      x = 1, y = 2, z = 3;
      

      它们将被视为单个语句,并从左到右进行评估(根据 C89)。

      【讨论】:

        【解决方案8】:

        正如其他人已经指出的那样:该语句将 1 分配给 i,然后计算 2、3、4 和 5。然后该语句的总值为 5(最后计算的表达式)。

        【讨论】:

          【解决方案9】:

          当您想要创建一个执行多项操作并像函数一样返回值的宏时,这很有用:

          #define STEAL_MAGIC_HAT(thing1, thing2, cat) \
          (smack(thing1), punch(thing2),get_hat(cat))
          
          extern thing_t g_thing1, g_thing2;
          extern cat_t g_cat;
          ...
          
              hat_t hat = STEAL_MAGIC_HAT(g_thing1, g_thing2, g_cat);
              don(hat);
          ...
          

          【讨论】:

            猜你喜欢
            • 2012-02-12
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 2012-01-29
            • 2017-10-10
            • 2021-08-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多