Tag: 促销

为什么当float不能表示所有的int值时,C ++将int提升为float?

说我有以下几点: int i = 23; float f = 3.14; if (i == f) // do something i将被提升为一个float ,并将两个float进行比较,但float是否可以表示所有的int值? 为什么不把int和float提升为double ?

h和hh修饰符用于printf的目的是什么?

除了%hn和%hhn (其中h或hh指定指向对象的大小), printf格式说明符的h和hh修饰符有什么意义? 由于标准要求的可变参数函数的默认升级,不可能将char或shorttypes的参数(或其任何有符号/无符号变体)传递给printf 。 根据7.19.6.1(7), h修饰符: 指定后面的d,i,o,u,x或X转换规则适用于short int或unsigned short int参数(参数将根据整数提升进行提升,但其值将转换为short int或打印之前无符号短整型); 或者一个下面的n转换规范适用于一个短int参数的指针。 如果参数实际上是shorttypes或unsigned shorttypes,那么将int提升为int ,然后将其转换为short或unsigned short将会产生与提升为int相同的值 ,而不会返回任何转换。 因此,对于types为short或unsigned short , %d , %u等应该给%hd , %hu等等(对于chartypes和hh同样)。 据我所知, h或hh修饰符可能有用的唯一情况是当参数在short或unsigned short范围外传递一个int ,例如 printf("%hu", 0x10000); 但我的理解是,传递这样的错误types会导致不确定的行为,所以你不能期望它打印0。 我见过的一个真实世界的例子是这样的代码: char c = 0xf0; printf("%hhx", c); 尽pipe实现了一个简单的chartypes(在这种情况下, printf("%x", c)会打印fffffff0或类似的东西),作者期望它打印f0 。 但是这个期望值得吗? (注意:原来的types是char ,它被提升为int并被转换回unsigned char而不是char ,从而改变了被打印的值。但是标准是否指定了这个行为,或者它是一个实现细节破碎的软件可能依靠?)

C函数调用中的默认参数促销

build立 在调用C中的函数时,我有几个关于默认参数促销的问题。6.5.2.2“函数调用” C99标准中的第6,7和8段(pdf) (为了方便起见,强调增加并分成列表读): 第6段 如果表示被调用函数的expression式的types不包含原型 ,则将对每个参数执行整数提升,将types为float参数提升为double 。 这些被称为默认参数促销 。 如果参数个数不等于参数个数,则行为是不确定的。 如果使用包含原型的types定义函数,并且原型以省略号( , … )结尾,或者升级后的参数types与参数types不兼容,则行为是不确定的。 如果使用不包含原型的types定义函数,并且升级之后的参数types与升级之后的参数types不兼容,则行为是未定义的,但以下情况除外: 一个提升types是一个有符号的整数types,另一个提升types是对应的无符号整数types,并且该值可以在两种types中表示; 这两种types都是指向合格或不合格版本的字符types或void指针。 第7段 如果表示被调用函数的expression式包含一个包含原型的types, 那么这些参数就像通过赋值一样被隐式转换为相应参数的types,并将每个参数的types作为其声明的非限定版本types。 函数原型声明符中的省略号表示法导致参数types转换在最后声明的参数后停止。 在结尾参数上执行默认参数促销。 第8段 没有其他转换隐式执行; 特别是参数的数量和types不能与函数定义中不包含函数原型声明的参数进行比较。 我知道的 默认的参数促销是char和int / unsigned int和float到double short variadic函数的可选参数(如printf )受默认参数促销的限制 为了logging,我对函数原型的理解是这样的: void func(int a, char b, float c); // Function prototype void func(int a, char b, float c) { /* … […]