Program Tip

정수 합산 파랑, 짧은 + = 짧은 문제

programtip 2020. 11. 8. 10:54
반응형

정수 합산 파랑, 짧은 + = 짧은 문제


C # 프로그램 :

short a, b;
a = 10;
b = 10;
a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'.

// we can also write this code by using Arithmetic Assignment Operator as given below

a += b; // But this is running successfully, why?

Console.Write(a);

여기에 두 가지 질문이 있습니다. 첫 번째는 "왜 int에서 short plus short 결과입니까?"입니다.

음, short plus short가 짧다고 가정하고 어떤 일이 일어나는지보십시오.

short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;

그리고이 계산이 반바지로 이루어지면 평균은 물론 -9845입니다. 합은 가능한 가장 큰 숏보다 크므로 음수로 감싼 다음 음수를 나눕니다.

정수 산술이 주위를 감싸는 세계에서는 모든 계산을 int로 수행하는 것이 훨씬 더 합리적입니다. 이는 일반적인 계산이 오버플로되지 않도록 충분한 범위를 가질 가능성이 높은 유형입니다.

두 번째 질문은 다음과 같습니다.

  • short plus short is int
  • int를 short에 할당하는 것은 불법입니다.
  • a + = b는 a = a + b와 같습니다.
  • 따라서 short + = short는 불법이어야합니다.
  • 그렇다면 이것이 합법적 인 이유는 무엇입니까?

질문에 잘못된 전제가 있습니다. 위의 세 번째 줄이 잘못되었습니다. 섹션 7.17.2의 C # 사양 상태

그렇지 않고 선택한 연산자가 미리 정의 된 연산자이고 선택한 연산자의 반환 유형이 x 유형으로 명시 적으로 변환 가능한 경우, y가 암시 적으로 x 유형으로 변환 될 수 있거나 연산자가 시프트 연산자 인 경우 연산 x = (T) (x op y)로 평가됩니다. 여기서 T는 x의 유형입니다. 단, x는 한 번만 평가됩니다.

컴파일러는 사용자를 대신하여 캐스트를 삽입합니다. 올바른 이유는 다음과 같습니다.

  • short plus short is int
  • int를 short에 할당하는 것은 불법입니다.
  • s1 + = s2는 s1 = (short) (s1 + s2)와 같습니다.
  • 그러므로 이것은 합법적이어야합니다

캐스트를 삽입하지 않으면 여러 유형에 복합 할당을 사용하는 것이 불가능합니다.


음, +=연산자를 사용하면 값이 증가 할 것이다라고 a하면서, 짧은과를 =당신은거야라고 덮어 쓰기 연산의 결과 값을. 이 연산 a + b은 다른 방법으로 할 수 있다는 것을 알지 못하는 int를 산출하고 그 int를 short에 할당하려고합니다.


다음을 사용해야합니다.

a = (short)(a + b);

할당과 추가 할당의 동작의 차이점에 관해서는 이것과 관련이 있다고 생각합니다 (msdn에서)

x+=y
is equivalent to
x = x + y
except that x is only evaluated once. The meaning of the + operator is
dependent on the types of x and y (addition for numeric operands, 
concatenation for string operands, and so forth).

그러나 약간 모호하므로 더 깊은 이해를 가진 사람은 댓글을 달 수 있습니다.


이것은 int +가 정의 된 가장 작은 부호있는 유형이기 때문에 발생합니다 . 더 작은 것은 먼저 int로 승격됩니다. +=연산자에 대해 정의되어 +있지만 대상에 맞지 않는 결과를 처리하기위한 특수 경우 룰.


이는 + =가 오버로드 된 함수로 구현되기 때문입니다 (그 중 하나는 짧고 컴파일러가 가장 구체적인 오버로드를 선택 함). 표현식 (a + b)의 경우 컴파일러는 할당하기 전에 기본적으로 결과를 int로 확장합니다.

참고 URL : https://stackoverflow.com/questions/4343624/integer-summing-blues-short-short-problem

반응형