【问题标题】:Strange behaviour with for loop and size_tfor 循环和 size_t 的奇怪行为
【发布时间】:2010-11-30 07:43:42
【问题描述】:
 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = 0; i < size; i++) {
    printf("%d ", i);
 }

以上代码(使用gcc)输出

4

0 1 2 3

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < size; i++) {
    printf("%d ", i);
 }

这段代码(i 被初始化为 -1)只输出 4 并且在循环中没有任何内容。

 size_t size = sizeof(int);
 printf("%d\n", size);

 int i;
 for (i = -1; i < (int) size; i++) {
    printf("%d ", i);
 }

添加演员表使代码再次运行良好。输出是

4

-1 0 1 2 3

第二个代码出了什么问题?为什么 printf 在任何地方都不会出错?

【问题讨论】:

    标签: c for-loop printf size-t


    【解决方案1】:
    i < size
    

    当i 有符号且size 无符号时,i 在执行比较之前转换为无符号。这是所谓的通常算术转换的一部分。

    当-1 转换为无符号类型时,结果是无符号类型可表示的最大可能值,因此当i 为-1 对于size 的任何值时i &lt; size 为假。

    当您改用i &lt; (int)size 时,&lt; 的两个操作数都是int 类型,因此不需要执行转换,并且由于两个操作数都已签名,因此您会得到预期的结果。

    【讨论】:

    • 谢谢。这种行为是否普遍 - 在比较之前将 lhs 转换为 rhs 的类型?
    • 不,左或右并不重要,有些类型只是比其他类型更占主导地位。
    【解决方案2】:

    size_t 无符号。当您将 size 转换为 int 时,您将转换回有符号,并且比较有效。

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多