【问题标题】:How does this iteration work: for(++s ; *s; ++s)这个迭代是如何工作的:for(++s ; *s; ++s)
【发布时间】:2015-03-03 16:39:57
【问题描述】:

在 C 中给定一个字符串指针s,下面的迭代会做什么?即它以什么方式迭代字符串?

for (++s ; *s; ++s);

【问题讨论】:

  • str[1]开始,而不是str[0]
  • 直到空字符。并且通过修改s指针,这样以后就不是很有用了。
  • 你为什么在第一个参数中被++s“难倒”,但在最后一个参数中却没有被它难倒。有什么区别?
  • 进入循环时会发生什么,循环停止的位置等可以很容易地用调试器检查。
  • 如果 s 指向一个典型的空字符串,该循环将产生非常糟糕的行为。

标签: c string for-loop


【解决方案1】:

for (++s ; *s; ++s) 表示

  1. 将指针@​​987654322@ 增加到字符串的第二个元素,即s[1]
  2. 检查*s 是否为\0
  3. 如果*s != 0,则执行循环体,否则转到步骤5。
  4. s 增加1。转到第 3 步。
  5. 退出循环。

【讨论】:

    【解决方案2】:

    结构

    for (init ; cond ; incr) { body }
    

    大致翻译为(留在伪代码中)

    init
    while cond:
        body
        incr
    

    因此原文可以看成如下,这样语义应该更容易理解:

    ++s;
    while (*s) {
       /* no body shown */
       ++s;
    }
    

    【讨论】:

    • 等等,没有答案?那么它在这里做什么呢?
    • @ForceBru 好吧,“不是答案” - 我不会填写更多细节,例如。 ++ 在“大致”上做了什么或扩展了什么。如果 cmets 可以这么长,我会把它留在那里。无论如何,我呃,“整理”了开头。
    【解决方案3】:

    它只是从str[1] 开始迭代,而不是从str[0] 检查*str 是否为空终止符。

    这样工作:让str 成为 5 个字符的数组。 str->['f']['k']['g']['h']['\0']

    ++str 是“k”,而str[0] 是“f”。然后循环直到找到'\0'。

    【讨论】:

      【解决方案4】:

      这个for语句

      for (++s ; *s; ++s)
      

      其实等价于下面

      for ( int i = 1; s[i] != '\0' ; ++i )
      

      唯一的区别是在第一个 for 语句指针 s 将沿着字符串移动,而在第二个 for statamenet 之后,索引(变量 i)将在迭代中更改。

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 2014-11-02
        • 2012-03-29
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多