为什么预期输出不显示 [duplicate]

Why is the expected output not displayed [duplicate]

提问人:aleena george 提问时间:10/12/2023 最后编辑:Peter - Reinstate Monicaaleena george 更新时间:10/12/2023 访问量:90

问:

为什么没有输出?

#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

c 隐式转换 比较运算符 unsigned-integer 有符号整数

评论

1赞 aleena george 10/12/2023
它被成功编译。但未显示预期输出。
0赞 bereal 10/12/2023
你为什么要从?我认为,这是一个负值被投射到 .-1size_t
0赞 Peter - Reinstate Monica 10/12/2023
@bereal哇。即使迂腐,GCC 也不会发出警告。
1赞 bereal 10/12/2023
@Peter-ReinstateMonica对我有用,但不行:/-Wsign-compare-Wall
1赞 n. m. could be an AI 10/12/2023
让我们枚举所有整数,以便(在数学意义上,而不是 C 意义上)。有多少?我的手上写着 {-1, 0, 1, 2, 3} 总共有 5 个。为什么你期望打印 4 个数字?i-1 <= i < 4

答:

3赞 Vlad from Moscow 10/12/2023 #1

在 for 循环的条件表达式中

 for (i = -1; i < sizeof(array) / sizeof(int); i++) {

由于通常的算术转换,具有有符号类型的变量被隐式转换为无符号类型,因为表达式具有无符号整数类型,并且该类型的秩(通常是该类型的别名)大于该类型的秩。iintsize_tsizeof(array) / sizeof(int)size_tsize_tunsigned longint

因此,由于传播符号位,作为条件左操作数的表达式(变量最初设置为 )变成了一个非常大的无符号值。( size_t )-1i-1i < sizeof(array) / sizeof(int)

例如,尝试以下调用printf

printf( "( size_t )-1 = %zu\n", ( size_t )-1 );

因此,if 语句的条件计算结果为逻辑 false。

例如,你可以写

 for ( i = -1; i < ( int )( sizeof(array) / sizeof(int) ); i++) {

获取预期结果 - 执行 for 循环。

尽管在任何情况下,循环都会调用未定义的行为,因为 when 将等于表达式将尝试访问已定义数组之外的内存。i( int )( sizeof(array) / sizeof(int) ) - 1array[i+1]

写起来会更好,也更正确

for ( size_t i = 0; i < sizeof(array) / sizeof(*array); i++) {
    printf("%d ", array[i]);
}
2赞 ikegami 10/12/2023 #2

比较有符号值和无符号值可能会导致令人惊讶的行为。你正在有效地做,并且是一个巨大的数字。(size_t)i < sizeof(array) / sizeof(int)(size_t)-1

在这种情况下,没有理由从 ;这可以通过 正确且更简单地完成,从而避免手头的问题。(无论如何,您尝试循环一次太多次,并且从 开始也解决了这个问题。i = -1i = 0i = 0

始终启用编译器的警告。对于 gcc 或 clang,我使用 .它本来会抓住这一点的。-Wall -Wextra -pedantic

评论

1赞 Jonathan Leffler 10/12/2023
添加这样你就不会被诱惑使用带有警告的编译代码。-Werror
0赞 ikegami 10/12/2023
我不想忽视警告。
0赞 Jonathan Leffler 10/12/2023
我也不是,但我让编译器用 .-Werror