【问题标题】:The incrementer values for an array using a size_t operator [duplicate]使用 size_t 运算符的数组的增量值 [重复]
【发布时间】:2020-12-19 07:26:02
【问题描述】:

在以下代码中:

#include <stdio.h>
#include <stddef.h>

void main ()
{
    int n[5] = {1,2,3,4,5};
    
    printf("%s%13s\n","element","value");
    for (size_t i = 0; i<5; ++i)
    {
           printf("%7d%13u\n", i, n[i]);
        }
    
}

输出是:

element        value
  0            1
  1            2
  2            3
  3            4
  4            5

我不明白的是 i 是如何预先递增的,它会给出从 0 到 4 的值。

我认为应该是 1 到 4,因为它不会通过条件。

这背后的原因是什么?

【问题讨论】:

  • for 循环语句的第三部分(迭代表达式)总是在迭代完成后执行
  • 正确的应该是int main(void),通常是return 0;
  • @UnholySheep 我在回答的最后部分使用了您的评论,当我在打字时意识到我会非常接近说同样的话。希望你不要介意。

标签: arrays c pre-increment size-t


【解决方案1】:

计数器i 仅在循环定义的第三部分中的++i; 内预递增。这是一个完整的陈述,其中前后增量无关。
i 的可观察行为与增量无关,因为所有输出都在单独的循环体中完成。

正如不洁羊在评论中提到的那样:

for 循环语句的第三部分(迭代表达式)总是在之后迭代完成

【讨论】:

    【解决方案2】:

    为了进一步阐明评论和其他答案的观点

    for 循环语句的第三部分(迭代表达式)总是在迭代完成后执行

    该循环的手动展开将是

    #include <stdio.h>
    #include <stddef.h>
    
    void main ()
    {
        int n[5] = {1,2,3,4,5};
        
        printf("%s%13s\n","element","value");
        size_t i = 0;
        printf("%7d%13u\n", i, n[i]);
        ++i;
        printf("%7d%13u\n", i, n[i]);
        ++i;
        printf("%7d%13u\n", i, n[i]);
        ++i;
        printf("%7d%13u\n", i, n[i]);
        ++i;
        printf("%7d%13u\n", i, n[i]);
        ++i;
    }
    

    【讨论】:

    • 请修正我对 Unholy Sheep 评论的错误引用(损坏的降价)。否则很好的可视化,和我一起做一个很好的答案。
    【解决方案3】:

    我不明白的是 i 是如何预递增的

    不是,in[i]printf 循环中是完全独立的。

    • i 仍然从 0 增加到 4
    • 然后n[i] 对应的值是从 1 到 5。索引 i 仍在 [0,4] 范围内。

    顺便说一句,size_t 类型应该使用%zu

    for (size_t i = 0; i < 5; ++i)
    {
        printf("%7zu%13d\n", i, n[i]);
    }
    

    【讨论】:

    • 关于%zu,这段代码sn-p来自C如何编程一书,他们使用%u,你能解释一下为什么使用@987654332改为@?
    • %u 用于无符号类型,%zu 专用于size_t
    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2023-03-26
    • 2012-11-23
    • 2019-09-25
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多