2010-11-27 3 views
5

나는 ++ C# 및 C에서 다음과 같은 일을 시도했습니다. 하지만 둘 다 다른 대답을했습니다.C# 및 C++의 평가 순서는 무엇입니까? 나는 ++ C# 및 C에서 B의 결과를 얻기 위해 노력했다</p> <pre><code>int a = 5; int b = (a++)+(++a)+(a--)+(--a); </code></pre> <p>:

저는 C#에서 23 개, C++에서 20 개를 받았습니다.

그래서 대답 해주세요. 이유는 무엇입니까? 이것에 대한 이유는 무엇입니까?

답변

7

C#은 왼쪽에서 오른쪽으로 계산합니다. C++에서 funny expressionsundefined behavior을 호출합니다. 변수를 변경하고 다시 적용하지 않고 sequence point을 읽지 않기 때문입니다.

이 다른 컴파일러 (또는 다른 최적화 설정과도 같은 컴파일러)로 사용할 수 있습니다 (일반적으로 것이다가) (a++)+(++a)+(a--)+(--a)에 대해 서로 다른 결과를 의미한다.

0

C++의 전체 목록은 here을 참조하십시오. FredOverflow 말한다 같이, C 번호 바로

+2

나는 끝은'구문은 답변에서 작동'@ : – fredoverflow

+0

밖으로 편집 - P 감사합니다 생각하지 않습니다를 생성합니다. – Bojangles

4

좌측 식은 C에서 # C#에서 행동 (왼쪽에서 오른쪽으로 평가)

잘 정의한에서 평가하여, 출력 될 24 (되지 23)

int b = (a++)+(++a)+(a--)+(--a); 

     // 5 + 7 + 7 + 5 = 24 

C++에서 표현식은 sequence points 사이에서 a이 두 번 이상 수정 되었기 때문에 Undefined Behaviour을 호출합니다.

+0

@FredOverflow : 편집 해 주셔서 감사합니다. 나는 커피가 더 필요해.') –

+0

. 천만에. – fredoverflow

0

어쨌든 이렇게 올려다 보니 필자도 여기에 올릴 것입니다. 다음 규칙은 표현의 이러한 종류의에 적용되는 임베디드 표현

와 표현의 C# 5.0 사양

5.3.3.21 일반 규칙에서

: 괄호 표현 (§7.6.3) (7.6.6), 색인 접근 (7.6.8), 증가 및 감소 표현 (7.6.9, 7.7.5), 캐스트 표현 (7.7.6), 단항 + -, ~, * 표현식, 바이너리 +, -, *, /, %, < < >> >> < < = (§7.8, §7.9, §7.10, §7.11), 복합 할당 표현 (§7.17.2), 확인 된 표현식과 확인되지 않은 표현식 (§7.17), §7.8, §7.8, §7.6.12), 배열 및 델리게이트 작성 표현 (§7.6.10).

위의 각 표현식에는 무조건 의 고정 된 순서 (강조 표시)으로 평가되는 하나 이상의 하위 표현식이 있습니다. 예를 들어 binary % 연산자는 연산자의 왼쪽을 평가 한 다음 오른쪽을 평가합니다. 인덱싱 작업은 인덱싱 된 식을 계산 한 다음 왼쪽에서 오른쪽 순으로 각 인덱스 식을 계산합니다.

각 표현의 종류에 대한 자세한 규칙은 7 단원에 설명되어 있습니다.이 단원을 모두 여기에 나열하지는 않겠지 만 경험칙은 코드로 작성된대로 왼쪽에서 오른쪽으로 표시됩니다. 예 :인수의

7.5.1.2 런타임 평가

인수 목록의 표정은 항상 그들이 기록 된 순서대로 평가됩니다 보여줍니다. 따라서, 예를

class Test 
{ 
    static void F(int x, int y = -1, int z = -2) { 
      System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); 
    } 
    static void Main() { 
      int i = 0; 
      F(i++, i++, i++); 
      F(z: i++, x: i++); 
    } 
} 

출력을

x = 0, y = 1, z = 2 
x = 4, y = -1, z = 3