char + char = int? 왜?
이 질문에 이미 답변이 있습니다.
- byte + byte = int… 왜? 16 답변
유형 char
에 C # 결과 2 개 를 추가하는 이유는 무엇 int
입니까?
예를 들어, 이렇게하면 :
var pr = 'R' + 'G' + 'B' + 'Y' + 'P';
pr
변수가된다 int
타입. 나는 그것이 string
값이 "RGBYP"
.
C #이 이렇게 디자인 된 이유는 무엇입니까? 두 개의를 추가하는 기본 구현이 char
s string
를 연결하는 결과가 char
아니 었 int
습니까?
에 accoding의 문자의 문서 내재적 정수 값으로 변환 할 수 있습니다. char
유형은 사용자 정의를 정의하지 않습니다 operator +
정수의 하나가 사용되도록.
문자열로의 암시 적 변환이없는 이유는 "char가 암시 적으로 ushort로 변환되지만 그 반대는 아닌 이유" 에 대한 Eric Lippert의 첫 번째 의견에서 잘 설명됩니다. :
v1.0에서 고려되었습니다. 1999 년 6 월 6 일의 언어 디자인 노트에는 "우리는 그러한 변환이 존재해야하는지 논의했고,이 변환을 수행하는 세 번째 방법을 제공하는 것이 이상 할 것이라고 결정했습니다. [언어]는 이미 c.ToString () 및 new를 모두 지원합니다. String (c) "입니다.
char
숫자 값 (UTF-16 유니 코드 서수)을 갖는 값 유형입니다. 그러나 숫자 유형 (예 : int, float 등)으로 간주되지 않으므로 + 연산자는 char에 대해 정의되지 않습니다.
그러나 char
형식은 암시 적으로 숫자 int
형식으로 변환 될 수 있습니다 . 암시 적이므로 컴파일러는 C # 사양에 나와있는 우선 순위 규칙 집합에 따라 변환을 수행 할 수 있습니다. int
일반적으로 시도되는 첫 번째 작업 중 하나입니다. 그것은 +
연산자를 유효 하게 만들고, 이것이 수행 된 작업입니다.
원하는 작업을 수행하려면 빈 문자열로 시작하십시오.
var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';
char 유형과 달리 문자열 유형은 Object에 대해 오버로드 된 + 연산자를 정의합니다.이 연산자는 두 번째 용어가 무엇이든간에 ToString()
첫 번째 용어에 연결하기 전에 사용하는 문자열로 변환합니다 . 이는 암시 적 캐스팅이 수행되지 않음을 의미합니다. 이제 pr
변수는 문자열로 추론되며 모든 문자 값의 연결입니다.
단일 문자는 유니 코드 값으로 변환 될 수 있고 단일 문자열보다 적은 공간을 차지하는 정수로 쉽게 저장 될 수 있기 때문입니다.
MSDN에서 :
Char 개체의 값은 16 비트 숫자 (순서) 값입니다.
char는 정수 유형입니다. 문자가 아니라 숫자입니다!
'a'
숫자의 속기입니다.
따라서 두 문자를 추가하면 숫자가 생성됩니다.
바이트 추가에 대한이 질문을 살펴보십시오. 이는 직관적이지 않지만 동일한 것입니다.
섹션 4.1.5 (Integral Types) char
에서 정수 유형으로 정의 된 스펙의 또 다른 관련 비트 :
이진 들어
+
... 연산자, 피연산자는 형식으로 변환하는T
경우,T
중 첫 번째int
,uint
,long
그리고ulong
그것은 완전히 두 피연산자의 모든 가능한 값을 나타낼 수 있습니다.
따라서 a의 char
경우 둘 다로 변환 된 int
다음 int
s 로 추가됩니다 .
요점은 많은 C # 개념이 C ++ 및 C에서 비롯된다는 것입니다.
이러한 언어에서 단일 문자 상수 ( 'A'와 같은)는 Ascii 값으로 표현되며, 예상 할 수 있지만 유형은 char가 아니라 int입니다 (예 'A'는 int이며 65를 쓰는 것과 동일합니다).
따라서 이러한 모든 값을 추가하는 것은 일련의 ASCII 문자 코드를 작성하는 것과 같습니다.
var pr= 82 + 71 + 66 + ...;
이것은 어느 시점에서 C / C ++의 디자인 결정이었습니다 (C로 70 년대로 거슬러 올라갑니다).
에서 MSDN :
암시 적 변환은 메서드 호출 및 할당 문을 포함하여 많은 상황에서 발생할 수 있습니다 .
char는 암시 적으로 ushort, int, uint, long, ulong, float, double 또는 decimal로 변환 될 수 있습니다. 따라서 해당 할당 작업은 암시 적으로 char를 int로 변환합니다.
char
또는 System.Char
필수 유형입니다 :
0에서 65535 사이의 값을 갖는 부호없는 16 비트 정수를 나타내는 정수 유형입니다. 유형에 대해 가능한 값 세트는 유니 코드 문자 세트에 해당합니다.
이것은 정확히 유사한 동작 수단 uint16
또는 System.UInt16
로하고 추가 문자 +
때문에 오퍼레이터 따라서, 적분 값을 더 +
연산자에 과부하되지 않는다 char
.
개별 문자를 문자열로 연결하려면 StringBuilder.Append(char)
또는 new String(char[])
.
말했듯이 문자에는 유니 코드 값을 포함하는 Int32 값이 있기 때문입니다.
문자를 문자열로 연결하려면 다음 중 하나를 수행 할 수 있습니다.
문자 배열을 새 문자열에 전달합니다.
var pr = new string(new char[] { 'R', 'G', 'B', 'Y', 'P' });
StringBuilder 사용 :
StringBuilder sb = new StringBuilder();
sb.Append('R');
etc...
문자열로 시작하십시오.
var pr = string.Empty + 'R' + 'G' + 'B' + 'Y' + 'P';
각각을 문자열로 캐스트하십시오 (또는 첫 번째 것만 작동합니다).
var pr = (string)'R' + (string)'G' + (string)'B' + (string)'Y' + (string)'P';
비효율적이기 때문이 아닙니다. 문자를 연결하려면 문자열 작성기를 사용해야합니다. 그렇지 않으면 각 추가는 연결된 부분 문자열을 보유하기 위해 임시 메모리를 생성합니다. 이는 예제에서 4 개의 임시 메모리 할당이 발생해야 함을 의미합니다.
A Char is a textual representation of a 16-bit integer value. You are simply adding ints together. If you want to concatenate chars, you'll have to cast them to strings.
1) Definition (MSDN):
The char keyword is used to declare a 16-bit character, used to represent most of the known written languages throught the world.
2) Why char does like numeric types?
A char can be implicitly converted to a numeric type.
A char is closer to an integer than to a string. A string is only a collection of char objects, whereas an integer can present a char and vice versa.
3) Examples
You can simply convert the first of your chars to a string, to outwit your compiler:
var pr = 'R'.ToString() + 'G' + 'B' + 'Y' + 'P';
You could also define a char array and then use the string constructor:
char[] letters = { 'R', 'G', 'B','Y', 'P' };
string alphabet = new string(letters);
If you want to print out a character solely, you always have to convert it to a string, to get its text representation:
var foo1 = 'F';
MessageBox.Show(foo1.ToString());
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?
What you intended is not correct in respect to what you want to accomplish. A String is not an addition of chars, a String is an addition of so to say "singleton" strings.
So "a"+"b"=>"ab", which is absolutely correct if you take into account, that the + operator for strings is overloaded. And hence 'a' represents the ASCII char 65, it is totally consistent to say, that 'a'+'b' is 131.
Because a char plus another char can exceed the maximum value permitted for a char variable, that's why the result of that operation is converted to a int variable.
You are assuming that a char
is a string type. The value of a char
can be represented by a character value between single quotes, but if it helps, you should consider that to be an abstraction to provide readability, rather than forcing you as the developer to memorize the underlying value. It is, in fact, a numeric value type, so you should not expect any string manipulation functions to be applicable.
As to why why char + char = int
? I have no idea. Certainly, providing implicit conversion to Int32
would mitigate arithmetic overflows, but then why is short + short
not implicitly typed to int
?
참고URL : https://stackoverflow.com/questions/16851809/char-char-int-why
'Programing' 카테고리의 다른 글
Gmail을 통해 간단한 SMTP 명령을 사용하여 이메일을 보내는 방법은 무엇입니까? (0) | 2020.11.27 |
---|---|
단위 테스트를위한 Async Void 메서드 호출 대기 (0) | 2020.11.27 |
#if debug-> #if myOwnConfig? (0) | 2020.11.27 |
queue : work --daemon과 queue : listen의 차이점은 무엇입니까? (0) | 2020.11.27 |
렌더링 중 예외 발생 : 이진 XML 파일 줄 # -1 : 오류 팽창 클래스 (0) | 2020.11.27 |