c中的int和unsigned int

时间:2010-12-31 07:58:51

标签: c

main()
{
    int x=12;
    unsigned int y=12;

    if (x>y)
    {
        printf("abc");
    }
    else
    {
        printf("xyz");
    }
}

输出是什么?

5 个答案:

答案 0 :(得分:4)

修复编译器错误后,由于常规算术转换的规则(C99§6.3.1.8),签名的int将转换为无符号{

  

否则,如果操作数有   无符号整数类型的排名更高   或等于类型的等级   另一个操作数,然后是操作数   带有符号整数类型的转换   到操作数的类型   无符号整数类型。

此行为符合预期,因为12在unsigned int范围内。

但是,如果您按照评论中的建议使用x = -2;,则会将其转换为-2 + UINT_MAX(根据§6.3.1.3,有符号和无符号整数)。

-2 + UINT_MAX > 12为真,因此abc会打印出来。

答案 1 :(得分:3)

该代码无法编译。为了它的价值,我的编译器给出了以下输出:

foo.cpp: In function ‘int main()’:
foo.cpp:1: error: ‘printf’ was not declared in this scope
foo.cpp:1: error: ‘printf’ was not declared in this scope
foo.cpp:1: error: expected ‘}’ at end of input

修正错误后,程序会输出xyz,这是预期的,因为signed 12不大于unsigned 12

答案 2 :(得分:3)

注意:这个答案是特定于C99的。

缺少main的返回类型(应为int),因此您的代码不应编译。

此外

int main()
{
    int x=12;
    unsigned int y=12;

    if (x>y)
    {
        printf("abc");
    }
    else
    {
        printf("xyz");
    }
}

调用UB,因为缺少<stdio.h>

  

J.2 未定义的行为

     

- 对于在函数原型定义函数的范围内调用没有函数原型的函数,原型以省略号结束,或者促销后的参数类型与参数类型不兼容( 6.5.2.2)。

答案 3 :(得分:1)

假设您已包含库文件,除非您将编译器设置为严格行为,否则不需要返回main类型。所以另外假设你没有设置编译器严格表现!最终结果将是

XYZ

正如@Matthew Flaschen所说,在转换之后,两者都是相同的,所以第一个条件不会满足,它会进入其他部分。

答案 4 :(得分:1)