提问人:aleena george 提问时间:10/12/2023 最后编辑:Peter - Reinstate Monicaaleena george 更新时间:10/12/2023 访问量:90
为什么预期输出不显示 [duplicate]
Why is the expected output not displayed [duplicate]
问:
为什么没有输出?
#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
答:
在 for 循环的条件表达式中
for (i = -1; i < sizeof(array) / sizeof(int); i++) {
由于通常的算术转换,具有有符号类型的变量被隐式转换为无符号类型,因为表达式具有无符号整数类型,并且该类型的秩(通常是该类型的别名)大于该类型的秩。i
int
size_t
sizeof(array) / sizeof(int)
size_t
size_t
unsigned long
int
因此,由于传播符号位,作为条件左操作数的表达式(变量最初设置为 )变成了一个非常大的无符号值。( size_t )-1
i
-1
i < 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) ) - 1
array[i+1]
写起来会更好,也更正确
for ( size_t i = 0; i < sizeof(array) / sizeof(*array); i++) {
printf("%d ", array[i]);
}
比较有符号值和无符号值可能会导致令人惊讶的行为。你正在有效地做,并且是一个巨大的数字。(size_t)i < sizeof(array) / sizeof(int)
(size_t)-1
在这种情况下,没有理由从 ;这可以通过 正确且更简单地完成,从而避免手头的问题。(无论如何,您尝试循环一次太多次,并且从 开始也解决了这个问题。i = -1
i = 0
i = 0
始终启用编译器的警告。对于 gcc 或 clang,我使用 .它本来会抓住这一点的。-Wall -Wextra -pedantic
评论
-Werror
-Werror
评论
-1
size_t
-Wsign-compare
-Wall
i
-1 <= i < 4