2014-05-22 4 views
0

C의 게임 프로그래밍 자습서 초보자 가이드를 시작하기 만합니다. 아래 코드와 약간 혼동 스럽습니다. 주요 gameOverTick에서C의 사전 증가 연산

가 난 그냥 ++ (사전 INC) 작업이 gameOverTick에 무엇을 역할을 알고 싶습니다

case GAME_OVER: 
    printStatus("GAME OVER!!! The evil DarkLord was defeated"); 
    if (++gameOverTick % 100 == 0){ 
     status = PRINT_GAME_WELCOMESCREEN; // go back to welcome screen 
     gameOverTick = 0;   // reset gameOverTick 
    } 

을 통해 게임이있을 때 우리는 경우를 0으로 설정된다. if를 확인하는 동안 gameOverTick을 1로 설정하거나 0으로 설정합니다. 나는 post-inC++가 어떻게 작동하는지 알고있다. 그러나 이것은 나에게 새로운 것이다.

감사

+0

gameOverTick이 100이되면 0으로 리셋됩니다. –

+0

여기서'gameOverTick' 만 수정하면 (따라서 항상 0과 100 사이입니다), 나누기 ** 및 ** 조건은 재설정하는 데 가장 비용이 많이 드는 방법이어야합니다 어떤 천장에 도달하면 변수. –

+0

표현식에 사용 된 값에 '1'이 추가 된 점을 제외하고는 post-inc와 같습니다. 이것은 대부분의 상황에서 변수를 증가시키고 읽는 것으로 구현 될 수 있습니다. –

답변

-8

당신이 표현 불려 갔을 경우의 괄호 안에 작성한 코드까지 갈 경우, 식의 평가는 항상 주어진 표현

1을 고려, 연산자 우선 순위 규칙을 따릅니다. ++ 연산자는 가장 높은있다 우선 순위 '++ gameOverTick'은 먼저 '(gameOverTick = gameOverTick + 1)'로 평가됩니다.

2. 다음으로 우선 순위가 '%'연산자이므로 '(gameOverTick + 1) % 100' 계산됩니다

3. 마지막으로 최하위 우선 순위 연산자는 '=='이므로 '=='연산자의 왼쪽에서 얻은 결과가 오른쪽 값과 동일한 지 비교됩니다.

예 99

-99 처음 증가

-Consider gameOverTick 값으로 즉, % 동작 컸는 + 1 = 100

99, 즉 100 % 수행된다 (100) = 0

- 이제 평등 compared` 예이며, 1

제공 == 0 0

발현 년 - 평가 (1) 따라서이 경우 (1), 바랭이되는 같다 범 진정한 tes.

는 연산자 우선 순위에 대한 자세한 내용은 우리가 여기에 네 개의 답을 가지고 http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

+0

표현을 평가하는 근거에 대해 설명해 주시겠습니까? – prince

+6

**이 답변은 오해의 소지가 있습니다. 식 평가 순서는 우선 순위를 따르지 않습니다. ** x = A() + B() * C()를 고려하십시오. 이것은'a = A(); b = B(); c = C(); d = b * c; x = a + d; 또는 c = C(); a = A(); b = B(); d = b * c; x = a + d; 또는 b = B(); c = C(); d = b * c; a = A(); x = a + d;'또는 다른 여러 가지 방법을 사용할 수 있습니다. **'*'가 '+'보다 더 높은 우선 순위이기 때문에 시간의 피연산자가 덧셈의 피연산자보다 먼저 평가된다는 것을 의미하지는 않습니다 **. C는 서브 표현식의 평가에 대한 * 모든 순서 지정을 허용합니다. C#과 Java는 왼쪽에서 오른쪽으로 순서가 필요합니다. –

+2

특히 '%'가 계산되기 전에 '++'의 부작용이 발생해야한다는 진술에서 답이 잘못되었습니다. 이것은 완전히 잘못된 것입니다. '++'의 ** 값 **은 '%'보다 먼저 계산되어야하지만 ** 할당 **은 시퀀스 포인트가 끝나기 전에 * 어떤 * 시간에 발생할 수 있습니다. –

0

모듈로 계산하고 비교가 완료되기 전에이 하나 gameOverTick을 증가시킨다. (C에서의 좋은 경험 법칙은 유니 터리 연산이 바이너리보다 더 엄격한 바인딩을 가지고 있고 논리 연산을 통해 계산한다는 것입니다.) gameOverTick이 리셋 되기만하면 환영 화면으로 해킹 될 때까지 100 개의 루프를 기다리는 것입니다. 그것은 100

12

이 링크를 참조 할 수 있습니다 그리고 그들은 모두 같은 방법으로 잘못이다. 이 질문이 마음에 듭니다. 연산자의 우선 순위에 따라 하위 식 계산의 결과로 부작용이 발생하는 순서가 결정됩니다. 단순히이 잘못되었습니다. C에서 하위 표현식을 계산하는 순서는 우선 순위에 의해 제어되지 않습니다. 그것은 크게 정의되지 않았습니다. 여기서 특정한 경우

% 발생 전에 ++ 동작 계산되어야 값 (C# 및 Java에서는 왼쪽에서 오른쪽.되지 우선 순위로하지만로서 정의된다)하지만, ++ 작업과 관련된 할당은 언제든지 발생할 수 있습니다.특별한 경우에는 할당이 언제 발생하는지는 중요하지 않지만, 일 경우 쉽게 구성 할 수 있습니다.

0

C의 대부분의 표현식에는 값이 있습니다. 대부분의 표현에는 부작용이 있습니다.

두 식의 부작용 (즉, 변화가 다음 시퀀스 시점 이후에만 가능하다) i의 값을 증가시키는

/* a */ i++ 
/* b */ ++i 

다음 두 식을 고려한다. 첫 번째 표현식의 값은 이전 시퀀스 포인트에 있었던 값 i입니다. 두 번째 표현식의 값은 이전 시퀀스 포인트에 있던 i보다 하나 많은 값입니다.