【问题标题】:Why does the type conversion take place without me telling it to do so when doing "character + 1"?为什么在执行“字符+ 1”时没有我告诉它进行类型转换?
【发布时间】:2019-06-07 17:36:25
【问题描述】:

例如,当递增字符时:char character{'a'};'a',而 INT 是 97。当我说“字符 + 1”或“a + 1”时,我将得到整数值 98 而不是 'b'。现在,如果我执行“++character”,我将得到 char 'b'。

char character{'a'};
cout << character + 1 << '\n';
cout << ++character << '\n';

【问题讨论】:

  • 因为1 的类型是int
  • C++ 中的转换规则很疯狂。 @HongOoi 即使您指定两个操作数都具有char 类型,仍然会有转换:character + char{1}

标签: c++ ascii


【解决方案1】:

加法和自增运算符根据所涉及的类型以不同的方式指定。

[expr.add]

1 加法运算符 + 和 - 从左到右分组。通常 对算术操作数执行算术转换或 枚举类型。

通常的算术转换将每个小于int 的整数类型转换为int。没有阻止它,它已经融入了语言。而且因为这些转换发生在加法本身之前,结果类型不能小于int。所以character + 1int,由标准流类的operator&lt;&lt;(int) 重载打印出来。

但是,对于增量:

[expr.pre.incr]

1前缀++的操作数加1修改。操作数 应该是一个可修改的左值。操作数的类型应为 cv bool 以外的算术类型,或指向 a 的指针 完全定义的对象类型。结果是更新的操作数;它 是一个左值,如果操作数是一个位域,它就是一个位域。

结果++charactercharacter 的类型相同,即它仍然是char。它也是一个指向character 的可赋值表达式(左值)。分配给它与分配给character 相同。因此,结果是由标准流类的operator&lt;&lt;(char) 重载打印的char

【讨论】:

  • 我还搜索了哪里可以找到有关“常用算术转换”的信息。我搜索了最后一个 C++ 草稿,但找不到那个主题。
  • 谢谢!现在在open-std.org/JTC1/SC22/WG21/docs/papers/2018/n4778.pdf“7.4 通常的算术转换 [expr.arith.conv]”下得到它。搜索时似乎是拼写错误;)谢谢!
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多