c语言 - "? :"发生了什么?我不知道返回类型



我认为((1 ? (int)1 : (unsigned int)2) > -1)导致1(true),但实际上在Visual中是0(false);工作室;2017.

我认为(1 ? (int)1 : (unsigned int)2)的值应该是(int)1,因为1 ?是真的,1 > -1也是真的。

我不知道为什么这个表达式的最终结果是错误的。

当我尝试像((int)(1 ? (int)1 : (unsigned int)2) > -1)一样进行强制转换时,它会返回1(true)。

signed int test = -1;
signed int si = 1;
unsigned int ui = 2;
printf("%dn", ((1 ? si : ui) > test));
return 0;

我希望输出是1,但实际输出是0

a ? b : c的类型不依赖于a。它是由CCD_ 14和CCD_。完整的规则很复杂,但对于算术操作数,类型由通常的算术转换决定。实际上,这两个操作数被转换为一个公共类型。对于intunsigned int,结果类型为unsigned int

条件运算符? :在C 2018标准的第6.5.15条中进行了描述。第4段说,结果"转换为下面描述的类型">

第5段描述了算术类型、结构和并集的结果:

如果第二个和第三个操作数都具有算术类型,则由通常的算术转换确定的结果类型(如果它们应用于这两个操作数)就是结果的类型。如果两个操作数都具有结构类型或并集类型,则结果具有该类型。如果两个操作数都具有void类型,则结果具有void类型。

根据6.2.5 18,算术类型包括整数和浮点类型。(包括实数型和复数型。)6.3.1.8 1中描述了常用的算术转换,它们是(在我的总结中,未引用):

  • 如果其中一个是复杂类型,则结果是复杂的,其余规则描述实部和虚部的类型。否则,结果是真实的,剩下的规则描述其类型
  • 如果其中一个是long double,则结果是long double
  • 否则,如果其中一个是double,则结果是double
  • 否则,如果其中一个是float,则结果是float
  • 否则,整数提升将应用于每个操作数(在6.3.1.1 2中指定),然后将这两种类型转换为通用整数类型。这方面的完整规则有点复杂,使用了一个需要一些解释的秩概念,并涵盖了一些深奥的情况,所以我只将它们总结为正常情况:如果两种类型都是int或更窄(意味着更少的比特或相同数量的比特,但有符号而不是无符号),则结果是int。否则,如果两者都是unsigned int或更窄,则结果为unsigned int。否则,结果是更宽的类型

结构、并集和void规则都很清楚:两个操作数必须具有相同的类型,这就是结果。

第6段描述了指针的结果:

如果第二个和第三个操作数都是指针,或者一个是空指针常量,另一个是指针,则结果类型是指向用两个操作数引用的类型的所有类型限定符限定的类型的指针。此外,如果两个操作数都是指向兼容类型或兼容类型的不同限定版本的指针,则结果类型是指向复合类型的适当限定版本的指示器;如果一个操作数是空指针常量,则结果具有另一个操作对象的类型;否则,一个操作数是指向void的指针或void限定版本的指针,在这种情况下,结果类型是指向适当限定版本的void

总之,这意味着:

  • 如果任一操作数具有限定符(constvolatilerestrict_Atomic),请将这些限定符包括在结果类型中
  • 如果这两种类型不同但兼容(例如未知大小的数组和已知大小的数组,两者都具有相同类型的元素),则将这两个类型组合起来。(除了数组大小之外,组合的其他可能性还包括数组的元素是不同但兼容的类型,函数有参数列表和没有参数列表,以及函数的参数是不同但可兼容的类型。)

除非您完全知道正在展开的内容(并且您想要这种行为),否则不应该混合有符号值和无符号值[在此处检查原因]。在幕后,因为表达式中有一个unsigned数字,所以C的计算结果是大于运算符为unsigned integer >。因此,您的比较不会评估true,因为"unsigned -1"大于您的unsigned 1

?:运算符的结果具有无符号类型,因为它是intunsigned(第二个和第三个操作数)的常见类型。结果的"预期"值为1,但其类型为unsigned

其余的与?:完全无关。它在这个常见问题的众多答案中得到了很好的描述:对无符号和有符号整数的比较运算

如果我去掉这个代码,只需要在上面加一个数字:

unsigned x = (unsigned)-1;

在我正在调试的程序中,X的值为4294967295(UINT_MAX),即您的程序"看到"比较如下:

((1 ? (int)1 : (unsigned int)2) > 4294967296)

(本想把这作为评论输入,但我没有这个名声。)

相关内容

  • 没有找到相关文章

最新更新