为什么编译器将“ char”与“ int”而不是“ short”匹配?

后For​​sum:

我有一个小程序:

#include<iostream>
using namespace std;

void f(int)   { cout << "int\n";   }
void f(short) { cout << "short\n"; }

int main(void){
    char c = 0;
    f(c);
    return 0;
}

它打印int我觉得,如果这是因为“整数提升”,为什么不是short首选?

我也知道整数提升发生在表达式中(例如A = B)。但是我没有表达对f(),权利的呼吁吗?

如果这是关系到重载解决规则,为什么传递char到F将导致到编译器宁愿intshort

如果我删除f(int),那么f(c)会打电话给f(short)

因此,总而言之,我的问题是,它与“整数提升”还是“过载解决规则”有关?又为什么呢

eerorika:

通过重载解析,(积分)促销优先于其他(积分)转化

隐式转换序列的排名

1)完全匹配:无需转换,左值到右值转换,限定转换,函数指针转换,(从C ++ 17开始)用户定义的类类型到相同类的转换

2)促销:积分促销,浮点促销

3)转换:积分转换,浮点转换,浮点积分转换,指针转换,指针到成员转换,布尔值转换,用户定义的派生类到其基类的转换

因此,从char的升迁int优先于从char到的转化short


什么是促销?你可能会问。这是标准描述的一种特殊转换。

为什么charshort不升职?,您可以继续。整体促销始终是int或更大的类型。没有任何促销short

以下隐式转换被归类为整体促销:

  • 带符号的char或带符号的short可以转换为int;

  • 如果unsigned char或unsigned short可以保持整个值范围,则可以将其转换为int,否则可以将其转换为insigned;

  • 可以根据底层类型将char 转换为int或unsigned int:signed char或unsigned char(请参见上文);

  • wchar_t,char16_t和char32_t可以从下面的列表转换为第一种类型,该列表可以保留其整个值范围:int,unsigned int,long,unsigned long,long long,unsigned long long;可以将其基础类型未固定的无作用域枚举类型从下面的列表转换为第一种类型,该列表可以保留其整个值范围:int,unsigned int,long,unsigned long,long long或unsigned long long。如果值范围更大,则不应用整体促销;

  • 固定基础类型的无范围枚举类型可以转换为其提升的基础类型;

    (自C ++ 11起)

  • 如果位字段类型可以表示位字段的整个值范围,则可以将其转换为int;如果可以表示位字段的整个值范围,则可以将其转换为unsigned int,否则不应用整数提升;bool类型可以转换为int,其值false变为``0'',true变为1。


标准参考(当前标准草案):

[over.ics.scs]§3

[conv.prom]§1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么对于char,编译器为什么更喜欢int重载而不是varargs char重载?

为什么在使用CHAR类型的参数调用时构造函数选择INT类型而不是SHORT?

内存浪费?如果main()应该只返回0或1,为什么main是用int而不是short int甚至char声明的?

为什么编译器将char * p [10]视为char ** p?

当对char *进行类型定义并通过结构进行访问时,为什么编译器会看到char *与printf的转换说明符“ s”不匹配?

为什么我的编译器将字符串理解为const char []?

为什么TypeScript编译器将枚举编译为字典查找而不是简单对象?

Java编译器通过`(byte)+(char)-(int)+(long)-1`解释什么?

haskell-无法将类型'(Char,Int)'与'[Char]'错误匹配

为什么const int需要extern而不是const char *

为什么我可以在函数后返回“ int”而不是“ char *”?

为什么这个结构数组会覆盖 char * 而不是 int?

为什么const char * foo =“ Hello”; 编译但不是const int * foo = 5 ;?

尝试将char *添加到int时触发编译器错误?

为什么编译器无法将类型族的类型'a == a'与'`True'匹配?

为什么gcc编译器将pow(10,2)输出为99而不是100?

为什么Java API使用int而不是short或byte?

为什么编译器不能匹配此函数类型?

为什么“可能缺乏精度”不是编译器错误?

为什么unsafeBitCast不是编译器错误?

为什么我可以将值大于127的int传递给char数组,而不是直接传递给char数组?

为什么 strcpy 返回 char * 而不是 char

如何将int和double用作输入而不是char?

如果byte + byte = int为什么int + int不是short / long?在C#中

当将切片视为迭代器时,为什么编译器期望双重引用而不是引用?

为什么在传递int(不是int *)作为scanf()的参数时,编译器没有发出错误?

将char转换为short

将 char* 转换为 short*

为什么在某些编译器中可以声明一个数组,例如int myarr [noconstant]; 而不是别人?