【问题标题】:Dont understand this syntax不懂这个语法
【发布时间】:2010-02-16 09:35:32
【问题描述】:

鉴于这个循环,为什么末尾有一个分号?

for(s = string; *s == ' '; s++)
    ;

谢谢

edit * 那么是否可以反转此过程,使其从字符串末尾开始并检查空格并减少直到找到字符?

【问题讨论】:

  • 将其更改为使用 ++s -- 它有可能生成更好的代码。
  • 为什么这会让代码变得更好?在这个例子中也是一样的。
  • 如果您的编译器具有正确的优化(大多数都这样做,因此使用“潜在”一词),就会出现这种情况。除非需要后增量,否则最好使用前增量——优化通常不适用于非内置类型。
  • 回答您的编辑,是的,有可能:size_t len = strlen(string); char *s; for (s=string+len; *s == ' '; --s) ;

标签: c syntax


【解决方案1】:

这是一个空语句,在 C 中是一个空操作。就好像你说过:

for(s = string; *s == ' '; s++)
{
    // do nothing
}

当所有事情都可以在 for( ... ) 构造本身中完成时,您可以使用它 - C 语法要求有一个受控语句,但它没有什么可做的。

【讨论】:

  • 我不明白为什么这在 6 年后仍未被接受为答案
【解决方案2】:

分号在循环中创建一个空语句。此循环在string 中搜索第一个非空白char

【讨论】:

    【解决方案3】:

    分号表示在循环内什么都不做。在您的代码中,循环只是循环,直到字符串中的字符不是空格。也就是说,在该行 s 指向字符串中第一个不是空格的字符之后。

    【讨论】:

      【解决方案4】:

      因为在 C(和其他)中的语法是: 对于(初始化;条件;步骤) 身体

      body 可以是一个闭包({} 中的代码块),但 body 也可以是一个空的 ;

      【讨论】:

        【解决方案5】:

        我想指出,循环可以这样编写,以使其更明确正在发生的事情并提高可读性:

         for(s = string; *s == ' ';)
             s++;
        

        或者使用while循环:

         s = string;
         while(*s == ' ')
             s++;
        

        但我认为第一种使用空主体的方法更“c-惯用”(并且更难阅读)。

        【讨论】:

        • 可读性的提高只在你眼中,恕我直言。原始形式是惯用的这一事实使有经验的 C 程序员易于阅读。
        • 好吧,我们谈论它的唯一原因是因为 OP 无法理解它...
        【解决方案6】:

        它会导致循环什么也不做。所发生的只是指针前进了。

        【讨论】:

          【解决方案7】:

          必须有一个语句或块作为for 循环的“主体”。这是每次循环执行的内容(只要s 仍然指向一个空格)。

          分号本身就是 empty 语句——也就是说,循环体中什么也没有发生,只有for 循环行上的s++

          【讨论】:

            猜你喜欢
            • 2013-11-18
            • 2021-07-25
            • 2017-10-13
            • 2014-04-10
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2013-12-15
            • 1970-01-01
            相关资源
            最近更新 更多