为什么没有显示预期的输出

问题描述 投票:0回答:2

为什么没有输出?

#include <stdio.h>

int main() {
    int i;
    int array[4] = {10, 25, 36, 42};
    // int size=sizeof(array) / sizeof(int);
    for (i = -1; i < sizeof(array) / sizeof(int); i++) {
        printf("%d ", array[i+1]);
    }

    return 0;
}

预期输出为 10 25 36 42

arrays c printf
2个回答
1
投票

在 for 循环的条件表达式中

 for (i = -1; i < sizeof(array) / sizeof(int); i++) {
由于通常的算术转换,具有有符号类型

i

 的变量 
int
 被隐式转换为无符号类型 
size_t
 类型,因为表达式 
sizeof(array) / sizeof(int)
 具有无符号整数类型 
size_t
 以及类型 
size_t
 大于类型 
int
 的等级。

结果表达式 ( sze_t )-1 是条件的左操作数 我

< sizeof(array) / sizeof(int) becomes a very big unsigned value due to propagating the sign bit.

尝试调用 printf

printf( "( size_t )-1 = %zu\n", ( size_t )-1 );
因此 of 语句的条件计算结果为逻辑假。

你可以写例如

for (i = -1; i < ( int )( sizeof(array) / sizeof(int) ); i++) {
得到预期的结果。


0
投票
比较有符号和无符号值可能会导致令人惊讶的行为。您正在有效地做

(size_t)i < sizeof(array) / sizeof(int)

,并且 
(size_t)-1
 是一个巨大的数字。

在这种情况下,没有理由以

i = -1

 开头;使用 
i = 0
 可以正确且更简单地完成此操作,从而避免了当前的问题。

始终启用编译器的警告。对于 gcc 或 clang,我使用

-Wall -Wextra -pedantic

。它会抓住这个。

© www.soinside.com 2019 - 2024. All rights reserved.