char + char = int? Why?
为什么在c中添加两个
例如,当我这样做时:
1 | var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; |
为什么C设计成这样?添加两个
根据char的文档,可以将其隐式转换为整数值。
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)".
(感谢吉米找到那个报价)
但是,
要执行所需操作,请从空字符串开始:
1 | var pr ="" + 'R' + 'G' + 'B' + 'Y' + 'P'; |
与char类型不同,string类型为object定义了一个重载的+运算符,它将第二个术语(无论是什么)转换为使用
因为单个字符可以转换为Unicode值,并且可以很容易地存储为整数,与单个字符串相比占用的空间更少。
来自MSDN:
The value of a Char object is a 16-bit numeric (ordinal) value.
char是整数类型。它不是一个字符,而是一个数字!
所以添加两个字符会得到一个数字。
看看这个关于添加字节的问题,尽管这是违反直觉的,但也是一样的。
重点是,许多C概念来自C++和C.。
在这些语言中,单个字符常量(如"a")被表示为其ASCII值,尽管人们可能会期望,但它的类型不是char而是int(是的,"a"是int,与编写65相同)。
因此,添加所有这些值就像编写一系列ASCII字符代码,即
1 | var pr= 82 + 71 + 66 + ...; |
这是C/C++在某个时候的一个设计决定(用C返回到70)。
规范第4.1.5节(整型)中的另一个相关位将
For the binary
+ ... operators, the operands are converted to typeT , whereT is the first ofint ,uint ,long andulong that can fully represent all possible values of both operands.
因此,对于
来自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。
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.
这意味着它的行为与
使用
如前所述,这是因为char的int32值包含其unicode值。
如果要将字符连接到字符串中,可以执行以下操作之一:
将字符数组传递给新字符串:
使用StringBuilder:
1 2 3 |
从字符串开始:
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 |
如果要单独打印一个字符,则必须将其转换为字符串,才能获得其文本表示形式:
1 2 | var foo1 = 'F'; MessageBox.Show(foo1.ToString()); |
您假设
为什么选择
因为一个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。