main()
{
int x=12;
unsigned int y=12;
if (x>y)
{
printf("abc");
}
else
{
printf("xyz");
}
}
输出是什么?
答案 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)