为什么这段代码在C中返回false
好的,试着理解为什么下面的if语句是错误的。我把它翻了个底朝天,不明白这里发生了什么为什么这段代码在C中返回false,c,C,好的,试着理解为什么下面的if语句是错误的。我把它翻了个底朝天,不明白这里发生了什么 #define SIZE (sizeof(arr)/sizeof(int)) int main(int argc, char** argv) { int arr[] = {1,2,3,4,5,6,7,8}; if ( -1 <= SIZE ) printf( "true" ); else printf( "false" ); retur
#define SIZE (sizeof(arr)/sizeof(int))
int main(int argc, char** argv)
{
int arr[] = {1,2,3,4,5,6,7,8};
if ( -1 <= SIZE )
printf( "true" );
else
printf( "false" );
return 0;
}
#定义大小(sizeof(arr)/sizeof(int))
int main(int argc,字符**argv)
{
int arr[]={1,2,3,4,5,6,7,8};
如果(-1由于比较中有符号/无符号不匹配,它将打印false
sizeof
的结果是一个无符号的size\u t
值。当将int
值-1
与之比较时,整数被解释为一个非常大的无符号值
C99标准草案如此表述:
否则,如果具有无符号整数类型的操作数的秩大于或等于
等于另一个操作数类型的秩,然后为
有符号整数类型转换为无符号的操作数类型
整数类型
这里,size\u t
至少是unsigned int
,这使得它的秩等于或高于int
,从而导致int
转换为size\u t
另外,main()
确实返回了int
,我不明白您为什么要编辑掉它。由于比较中有符号/无符号不匹配,它会打印false
sizeof
的结果是一个无符号的size\u t
值。当将int
值-1
与之比较时,整数被解释为一个非常大的无符号值
C99标准草案如此表述:
否则,如果具有无符号整数类型的操作数的秩大于或等于
等于另一个操作数类型的秩,然后为
有符号整数类型转换为无符号的操作数类型
整数类型
这里,size\u t
至少是unsigned int
,这使得它的秩等于或高于int
,从而导致int
转换为size\u t
另外,main()
确实返回了int
,我不明白您为什么要编辑它。因此,编译器正在将int文本转换为无符号,与size\u t?相同(无符号int)-1
通常以0xFFFFFFFF
@DaveBlack不,文字永远不会被转换,它只是在代码中特定位置计算文字的值。@Agent\L正如我在注释中链接的答案中所解释的,它将始终是UMAX。@DaveBlack这不是由您决定的,main()根据定义,
必须返回int
。如果您正在执行其他操作,则不是使用符合标准的C语言编程。因此,编译器正在将int文本转换为无符号,与size\u t?(无符号int)相同-1
通常以0xFFFFFFFF
@DaveBlack不,文字永远不会被转换,它只是在代码中特定位置计算文字的值。@Agent\L正如我在注释中链接的答案中所解释的,它将始终是UMAX。@DaveBlack这不是由您决定的,main()根据定义,
必须返回int
。如果您正在执行其他操作,则不是使用符合标准的C语言编程。更好的宏应该是#define SIZE(sizeof(arr)/sizeof(*(arr)))
据我所知,您的程序表现出实现定义的行为,这取决于int
和size\u t
的相对整数秩。我不知道任何具有秩int
>秩size\u t
的实现,这是在您的示例中打印true
所必需的。您可以不使用原型样式,但然后您就处于C99之前的向后兼容模式。您真的不想去那里。使用intmain(intargc,char**argv)
,intmain(void)
或兼容。这是一个更好的宏的副本,应该是#定义大小(sizeof(arr)/sizeof(*(arr)))
据我所知,您的程序表现出实现定义的行为,这取决于int
和size\u t
的相对整数秩。我不知道任何具有秩int
>秩size\u t
的实现,这是在您的示例中打印true
所必需的。您可以不使用原型样式,但然后您处于C99之前的向后兼容模式。您真的不想去那里。使用int-main(int-argc,char**argv)
,int-main(void)
或兼容。这是