Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这段代码在C中返回false_C - Fatal编程技术网

为什么这段代码在C中返回false

为什么这段代码在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

好的,试着理解为什么下面的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" );

    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)
或兼容。这是