关于C + #:char + char = int

char + char = int? Why?

本问题已经有最佳答案,请猛点这里访问。

为什么在c中添加两个char结果到int类型?

例如,当我这样做时:

1
var pr = 'R' + 'G' + 'B' + 'Y' + 'P';

pr变量变为int类型。我希望它是一个string类型,值为"RGBYP"

为什么C设计成这样?添加两个char的默认实现是否应该导致连接charstring,而不是int


根据char的文档,可以将其隐式转换为整数值。char类型没有定义自定义operator +,因此使用整数类型。

EricLippert在其博客"为什么char隐式转换为ushort,而不是相反"中的第一条评论很好地解释了没有隐式转换为字符串的原因。:

It was considered in v1.0. The language design notes from June 6th
1999 say"We discussed whether such a conversion should exist, and
decided that it would be odd to provide a third way to do this
conversion. [The language] already supports both c.ToString() and new
String(c)".

(感谢吉米找到那个报价)


char是一个值类型,这意味着它有一个数值(它的utf-16 Unicode序数)。但是,它不被视为数字类型(如int、float等),因此,没有为char定义+运算符。

但是,char类型可以隐式转换为数字int类型。因为它是隐式的,所以编译器可以根据C规范中规定的一组优先规则进行转换。int是通常尝试的第一件事情之一。这使得+操作符有效,所以这就是所执行的操作。

要执行所需操作,请从空字符串开始:

1
var pr ="" + 'R' + 'G' + 'B' + 'Y' + 'P';

与char类型不同,string类型为object定义了一个重载的+运算符,它将第二个术语(无论是什么)转换为使用ToString()的字符串,然后将其连接到第一个术语。这意味着不执行隐式转换;您的pr变量现在被推断为字符串,并且是所有字符值的串联。


因为单个字符可以转换为Unicode值,并且可以很容易地存储为整数,与单个字符串相比占用的空间更少。


来自MSDN:

The value of a Char object is a 16-bit numeric (ordinal) value.

char是整数类型。它不是一个字符,而是一个数字!

'a'只是数字的简写。

所以添加两个字符会得到一个数字。

看看这个关于添加字节的问题,尽管这是违反直觉的,但也是一样的。


重点是,许多C概念来自C++和C.。

在这些语言中,单个字符常量(如"a")被表示为其ASCII值,尽管人们可能会期望,但它的类型不是char而是int(是的,"a"是int,与编写65相同)。

因此,添加所有这些值就像编写一系列ASCII字符代码,即

1
   var pr= 82 + 71 + 66 + ...;

这是C/C++在某个时候的一个设计决定(用C返回到70)。


规范第4.1.5节(整型)中的另一个相关位将char定义为整型:

For the binary + ... operators, the operands are converted to type T, where T is the first of int, uint, long and ulong that can fully represent all possible values of both operands.

因此,对于char,两者都转换为int,然后作为ints添加。


来自MSDN:

Implicit conversions might occur in many situations, including method
invoking and assignment statements.

可以将char隐式转换为ushort、int、uint、long、ulong、float、double或decimal。因此,赋值操作隐式地将char转换为int。


charSystem.Char是一种整型:

An integral type representing unsigned 16-bit integers with values between 0 and 65535. The set of possible values for the type corresponds to the Unicode character set.

这意味着它的行为与uint16System.UInt16的行为完全相同,因此用+运算符添加chars会添加整数值,因为+运算符在char中没有超载。

使用StringBuilder.Append(char)new String(char[])将单个字符连接成字符串。


如前所述,这是因为char的int32值包含其unicode值。

如果要将字符连接到字符串中,可以执行以下操作之一:

将字符数组传递给新字符串:

1
var pr = new string(new char[] { 'R', 'G', 'B', 'Y', 'P' });

使用StringBuilder:

1
2
3
StringBuilder sb = new StringBuilder();
sb.Append('R');
etc...

从字符串开始:

1
var pr = string.Empty + 'R' + 'G' + 'B' + 'Y' + 'P';

将每一个都转换成一个字符串(或者只使用第一个字符串):

1
var pr = (string)'R' + (string)'G' + (string)'B' + (string)'Y' + (string)'P';


不应该这样,因为那样效率会很低。如果要像这样连接字符,则应使用字符串生成器。否则,每次添加都会创建一个临时内存来保存指定的部分字符串,这意味着在示例中必须进行4次临时内存分配。


char是16位整数值的文本表示。你只是简单地把整数加在一起。如果要连接字符,必须将它们转换为字符串。


1)定义(msdn):

char关键字用于声明16位字符,用于表示世界上大多数已知的书面语言。

2)为什么char喜欢数字类型?

1
A char can be implicitly converted to a numeric type.

字符比字符串更接近整数。字符串只是char对象的集合,而整数可以表示char,反之亦然。

3)实例

您可以简单地将第一个字符转换为一个字符串,以胜过编译器:

1
var pr = 'R'.ToString() + 'G' + 'B' + 'Y' + 'P';

您还可以定义一个char数组,然后使用字符串构造函数:

1
2
char[] letters = { 'R', 'G', 'B','Y', 'P' };
string alphabet = new string(letters);

如果要单独打印一个字符,则必须将其转换为字符串,才能获得其文本表示形式:

1
2
 var foo1 = 'F';
 MessageBox.Show(foo1.ToString());

您假设char是字符串类型。EDOCX1的值(0)可以用单引号之间的字符值来表示,但是如果它有帮助,您应该将其视为提供可读性的抽象,而不是强迫您作为开发人员记忆基础值。实际上,它是一个数值类型,因此您不应该期望任何字符串操作函数都适用。

为什么选择char + char = int?我不知道。当然,向Int32提供隐式转换可以缓解算术溢出,但为什么short + short没有隐式键入int


因为一个char加上另一个char可以超过char变量所允许的最大值,所以该操作的结果被转换为int变量。


Why is C# designed like this? Wasn't the default implementation of
adding two chars should be resulting to a string that concatenates the
chars, not int?

就你想要完成的事情而言,你的意图是不正确的。字符串不是字符的加法,字符串是"singleton"字符串的加法。

所以"a"+"b"=>"a b",这是绝对正确的,如果考虑到字符串的+运算符过载。因此,"a"代表ASCII字符65,完全一致地说,"a"+"b"是131。