首页 > 试题广场 >

下列代码的输出结果是?

[单选题]
下列代码的输出结果是
int i = -1;
unsigned j = 1;
if (j > i)
    printf(" (j>i)成立\n");
else
    printf(" (j>i)不成立\n");

if (i < j)
    printf(" (i<j)成立\n");
else
    printf(" (i<j)不成立\n");

  • (j>i)成立,(i<j)成立
  • (j>i)不成立,(i<j)成立
  • (j>i)成立,(i<j)不成立
  • (j>i)不成立,(i<j)不成立
推荐
答案是D。

解释:
表达式会包含隐式类型转换,它由编译器自动执行,不需程序员介入。

何时发生隐式类型转换

1. 在混合类型的表达式中,操作数会被转换为相同类型

int ival; double dval;
ival >= dval; // ival converted to double

2. 条件表达式会被转换为bool类型。

int ival; if (ival) // ival converted to bool while (cin) // cin converted to bool

条件操作符(? :)中的第一个操作数,逻辑非(!)、逻辑与(&&)、逻辑或(||)的操作数都是条件表达式。if、while、do while、以及for的第2个表达式都是条件表达式。

3. 初始化和赋值

int ival = 3.14 // 3.14 converted to int int *ip;
ip = 0; // the int 0 converted to a null pointer of type int *

4. 在函数调用时,所传递的参数也可能发生隐式类型转换。

如何转换

1. 算术转换

算术转换保证在执行操作前,将二元操作符的两个操作数转换为同一类型,并使表达式的值也具有相同的类型。

算术转换通常的是做整形提升(integral promotion),对于所有比int小的整形,包括char、signed char、unsigned char、short和unsigned short,如果该类型的所有可能的值都能包含在int内,它们就会被提升为int,否则被提升为unsigned int。如果将bool值提升为int,则false转换为0,true转换为1。

包含short和int类型的表达式,short转换为int。如果int足以表示所有unsigned short类型的值,则将unsigned short转换为int,否则两个操作数均转换为unsigned int。long和unsigned int的转换也一样。只要机器上的long足够表示unsigned int类型所有的值,就将unsigned int转换为long,否则两个操作数都转换为unsigned long。在32位的机器上,long和int通常用一个字长表示,此时如果表达式包含unsigned int和long,两者都转换为unsigned long。

如果表达式包含signed和unsigned int,signed会被转换为unsigned。如果int 操作数的值恰为负数,其转换为unsigned int可能会变为一个很大的正数(转换结果是该负值对unsigned int的取值个数求模)。所以最好避免对int和unsigned int的两个操作数进行比较。

转换示例:

2. 其他隐式转换

(1)数组名转换为指向其第一个元素的指针

int ia[10]; // array of 10 ints int *ip = ia; // convert ia to pointer to first element

另外,任意数据类型的指针都可转换为void *,整形数值常量0可以转换为任意类型指针。

(2)指针值可转换为bool

如果指针为0,转换为false,否则转换为true。

if (cp) // true if pointer cp is not zero

(3)算术类型与bool的转换

算术类型转换为bool时,0转换为false,其他值(包括负值)转换为true。将bool转换为算术类型时,true转换为1,false转换为0。

(4)转换与枚举类型

枚举类型对象或枚举成员将自动转换为整形,其转换结果可以用于任何需要使用整数值的地方。具体会被转换为哪种整形,依赖于枚举成员的最大值和机器。enum对象或枚举成员至少提升为int,如果int无法表示枚举成员的最大值,则提升到能表示所有枚举成员值的、大于int型的最小类型(unsigned int 、long或unsigned long)。

编辑于 2015-02-06 15:16:14 回复(10)
隐式类型转换 static_cast

如果表达式包含signed和unsigned int,signed会被转换为unsigned。
发表于 2015-09-04 19:45:14 回复(0)

楼上小海豹说的很详细,总结起来对于本题类型转换为int->unsigned int。以8字长为例,-1在计算机中表示为11111111,若该数为无符号数则为一个大正数,而1为00000001,。因此前者要比后者大。

发表于 2017-05-08 09:39:27 回复(2)
由于隐式类型转换,编译器自动将int(signed int)转换为unsigned int。
signed int型数据-1D的二进制原码为:
反码(符号位不变,其他位取反)为:

那么补码(反码+1)为:

而unsigned int型1D的补码为:

计算机中都是以补码形式存储数据,所以i>j。
发表于 2020-05-05 21:00:35 回复(0)
在内存中的数据是以补码的形式存储的,内存并不知道该数是正还是负,仅靠补码来比较大小,所以0xFFFF大于0x0001
发表于 2017-04-30 11:13:34 回复(0)
如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算:
char/short  -> int -> unsigned->long ->double 高
发表于 2019-09-06 16:01:28 回复(0)
试验表明,选择D是正确的。
编辑于 2015-01-28 22:17:27 回复(0)
<p>int与unsigned比较时,int视为unsigned</p>
发表于 2020-07-02 09:17:51 回复(0)

从这道题能看出来C++的缺点

发表于 2020-01-22 12:17:54 回复(0)
果然是类型提升,还好我机智
发表于 2019-08-12 23:16:41 回复(0)
算数比较符发生时会产生类型变化。
发表于 2019-06-25 07:41:48 回复(0)

此题出得跟**一样,同样的代码要写两遍

发表于 2019-06-23 09:15:42 回复(0)
答案没有回车,逗号也不知道哪来的
发表于 2019-03-02 08:52:24 回复(0)
发生隐式类型转换,向上转换,unsigned和int,int转换为unsigned
发表于 2018-10-07 11:43:17 回复(0)
signed 会被转换成unsiged
发表于 2018-04-16 18:59:03 回复(0)
在比较的时候,int转换成unsigned,所以值相等
发表于 2018-04-11 16:11:13 回复(0)
表达式包含signed和unsigned int,signed会被转换为unsigned。如果int 操作数的值恰为负数,其转换为unsigned int可能会变为一个很大的正数(转换结果是该负值对unsigned int的取值个数求模)。所以最好避免对int和unsigned int的两个操作数进行比较。
发表于 2017-09-01 11:26:19 回复(0)
因为int与unsigned进行比较时会转换为unsigned,则i与j相等
发表于 2017-08-19 14:26:39 回复(0)
int和unsigned int比较时会转换,int-unsigned int,由于计算机存储数值以补码方式。所以负数的int变为unsigned int会变为很大值
发表于 2017-08-19 14:19:03 回复(0)
当 int 遇上 unsigned int, int 被转换成 unsigned int.
发表于 2017-03-29 07:38:02 回复(0)
提供个非编程的思路:
(j>i)成立 和(j>i)不成立是互异的,

  • (j>i)成立,(i<j)成立
    j>i成立

  • (j>i)不成立,(i<j)成立
    j>i自相矛盾

  • (j>i)成立,(i<j)不成立
    同B自相矛盾

  • (j>i)不成立,(i<j)不成立
  j>i不成立

从AD选
发表于 2017-01-12 22:33:28 回复(1)