首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于隐式地将'int‘转换为'char',为什么’s[i] += s[j]‘和’s[i]= s[i]+s[j]‘不同?

关于隐式地将'int‘转换为'char',为什么’s[i] += s[j]‘和’s[i]= s[i]+s[j]‘不同?
EN

Stack Overflow用户
提问于 2019-04-01 10:07:09
回答 1查看 2.1K关注 0票数 25

演示的示例代码:

代码语言:javascript
复制
public void ReverseString(char[] s) {
  for(int i = 0, j = s.Length-1; i < j; i++, j--){
        //s[i] = s[i]+s[j]; //<-- error           
        s[i] += s[j];       //<-- ok 

        s[j] = (char)(s[i] - s[j]); //<-- cast
        s[i] -= s[j];
    }
}

作为上面的代码片段,虽然s[i] += s[j]没有任何错误。它的等价语句s[i] = s[i]+s[j]将导致以下错误

错误CS0266:不能隐式地将类型'int‘转换为'char’。存在显式转换(您是否缺少强制转换?

我的问题是他们有什么区别以及为什么。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-01 10:12:06

它的等价语句s[i] = s[i]+s[j]将导致以下错误

这不是一个等价的陈述,虽然我能理解为什么你会期待它。来自第12.18.3款的C# 5 ECMA标准,围绕复合赋值:

表单x op= y的操作是通过应用二进制操作符重载解析(§12.4.5)来处理的,就好像操作是写入x op y一样。然后,

  • 如果所选运算符的返回类型隐式转换为x类型,则计算操作为x = x op y,但只计算x一次。
  • 否则,如果所选运算符是预定义运算符,如果所选运算符的返回类型显式可转换为x类型,而如果y隐式可转换为x类型或运算符是移位运算符,则操作将被计算为x = (T)(x op y),其中Tx类型,但x只计算一次。

第二颗子弹就是这里发生的事。没有可以将char值添加到一起的运算符--有一个int +(int, int)运算符,这是所选的--并且有一个从intchar的显式转换。

所以这个:

代码语言:javascript
复制
s[i] += s[j];

更等价于

代码语言:javascript
复制
s[i] = (char) (s[i] + s[j]);

..。汇编得很好。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55452604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档