C如何处理char sums?

Mag*_*Vis 4 c c++ int char

当我使用C++时,我调用了一个重载函数foo,如下所示:

foo('e' - (char) 5)
Run Code Online (Sandbox Code Playgroud)

它可以根据类型结果输出"this is a char"或"this is a int".我从我的程序中得到"这是一个int",如下所示:

#include <iostream>

void foo(char x)
{
    std::cout << "output is a char" << std::endl;
}
void foo(int x)
{
    std::cout << "output is an int" << std::endl;
}
int main()
{
    foo('a' + (char) 5);
}
Run Code Online (Sandbox Code Playgroud)

我的导师说,在C中,上面的表达式('a' + (char) 5),作为char计算.我在C99标准中看到,字符被提升为整数以查找总和,但是当C完成时C是否会将它们重新转换为字符?我找不到任何看似可信的参考文献,说明促销完成后C实际上做了什么,并找到了总和.

总和是作为int保留还是作为char给出?我如何在C中证明这一点,或者是否有我不理解/发现的参考?

Bar*_*rry 6

从C标准,6.3.1.8通常的算术转换,强调我的:

许多期望算术类型操作数的运算符会以类似的方式导致转换并产生结果类型.目的是确定操作数和结果的通用实数类型.对于指定的操作数,每个操作数在不更改类型域的情况下转换为其对应的实类型是公共实类型的类型.除非另有明确说明,否则公共实类型也是结果的对应实数类型,如果它们相同则其类型域是操作数的类型域,否则是复数.这种模式称为通常的算术转换:

  • 首先,如果任一操作数的相对实数类型是long double......
  • 否则,如果任一操作数的相应实数类型是double......
  • 否则,如果任一操作数的相应实数类型是float......
  • 否则,将对两个操作数执行整数提升.然后将以下规则应用于提升的操作数:
    • 如果两个操作数具有相同的类型,则不需要进一步转换.

所以你完全正确.表达式的类型'a' + (char) 5int.char除非用户明确要求,否则不会重铸.请注意,'a'这里有类型int,所以只(char)5需要提升.这在6.4.4.4字符常量中规定:

整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'.
...
整数字符常量具有类型int.

有一个例子证明明确重铸为char:

在执行片段时

char c1, c2;
/* ... */
c1 = c1 + c2
Run Code Online (Sandbox Code Playgroud)

''整数促销''要求抽象机器将每个变量的值提升为int大小,然后添加两个ints并截断总和.如果char可以在没有溢出的情况下添加两个s,或者无声地溢出包装以产生正确的结果,则实际执行仅需要产生相同的结果,可能省略促销.

这里的截断只发生,因为我们分配回一个char.