c언어에서 해당 코드가 왜 이런 값이 나왔는지 모르겠습니다

조회수 284회
//#include <stdio.h>

int main(void) {
  int num = 5;

  num &= ++num;
  printf("%d", num);

  num &= num++;
  printf("%d", num);

  return 0;
}

1번

  1. num &= ++num
  2. num = num & ++num
  3. num = num & (num+1) //전위증가
  4. num = 5 & 6
  5. num = 4

2번

  1. num &= num++
  2. num = num & num++
  3. num = (num & num) +1 //후위증가
  4. num = (4 & 4) + 1
  5. num = 4 + 1
  6. num = 5

"\n 이 없으므로 이어붙여서"

답 : 45

가 나와야 하는데

답은 66이 나옵니다...

뭐가 문제인걸까요....??

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    num &= ++num;
    

    위의 한줄은 아래의 두줄이 순서대로 실행된 것과 같습니다.

    ++num;
    num&=num;
    

    한편,

    num &= num++;
    

    위의 한줄은 아래의 두줄이 순서대로 실행된 것과 같습니다.

    num&=num;
    num++;
    

    질문에선 66이 출력된다고 했는데, 실제 돌려보시면 67이 출력됩니다. 그 이유는 위의 설명과 아래 코드의 주석을 확인하세요.

    • 결과

    이미지

    #include <stdio.h>
    
    int main(void) {
      int num = 5;
    
      num &= ++num;
    // 일단 num이 1 증가되어 num은 6이 되고,
    // 그후, num &= num;의 결과는 num=6&6;이므로 num은 결국 6입니다.
    
      printf("%d", num);
    
      num &= num++;
    // 현재 num은 6이고, num &= num;의 결과는 num=6&6;이므로 num은 그대로 6입니다.
    // 그후, num++이 실행되어 num은 7이 됩니다.
    
      printf("%d", num);
    
      return 0;
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 코드 실행기로 실행하면 결과값은 66이 나오는데욥...? Magnolia97 2022.5.28 22:04
    • 사진은 제가 직접 윈도우즈 10에서 비주얼 스튜디오 커뮤니티 2022로 동작시키고 캡처한 화면입니다. 알 수 없는 사용자 2022.5.28 22:08
    • 전치처리와 후치처리가 포함된 코드의 평가 순서는 C와 C++에서 정확히 정의된 것은 아니어서, 제가 위에서 설명한 대로 대부분의 컴파일러가 처리하는 것이 일반적입니다. 알 수 없는 사용자 2022.5.28 22:10
    • 회사등에서 실제 코드를 작성할 때에는 1줄로 쓰지 말고, 동등한 처리를 하는 2줄로 나눠서 쓰는 것이 좋습니다. 알 수 없는 사용자 2022.5.28 22:11
    • 어떤 컴파일러 쓰는데 66이라고 나오나요? 알 수 없는 사용자 2022.5.28 22:14
    • 비주얼 코드 스튜디오는 따로 c언어를 컴퓨터에 깔아야 하는 것 같아서 사용하진 않았습니다 Magnolia97 2022.5.28 22:15
    • 대신 replit와 이 사이트 자체적으로 있는 코드실행기로만 확인해봤습니다.. ! Magnolia97 2022.5.28 22:16
    • 만약 직접 돌려본게 아니라면 해보시면 66이 아니고 67이 나올거에요. 알 수 없는 사용자 2022.5.28 22:17
    • 이 사이트에서 제공하는 컴파일러로 동작시키니까 정말 66이 나오네요. 알 수 없는 사용자 2022.5.28 22:19
    • 두 사이트 직접 돌려봤는데 모두 66이 나왔어요... 계산 순서 문제인지 모르겠는데 자세한건 저도 잘 모르겠네요... 그리구 해당 코드는 https://www.youtube.com/watch?v=3uEPZYKH1DI 이 영상의 17번 문제에서 보고 가져온건데요 여기서도 답이 66이라고 나와서 혼란스럽네요 Magnolia97 2022.5.28 22:19
    • MS에서는 67로, GCC에선 66으로 출력되는 것 같네요. 위에 3번-4번째 댓글에서 설명한 것으로 이해하시면 되겠습니다. 알 수 없는 사용자 2022.5.28 22:21
    • 이런 계산식은 업계에서 자주 쓰는 계산식은 아니죠...? ms냐 gcc냐에 따라서 계산 결과가 다르게 나오다니... Magnolia97 2022.5.28 22:28
    • C++을 만든 사람이 쓴 책에서도 이러한 전치 증가와 후치 증가를 수식에 넣어서 사용하는 것이, 언어 자체로 정의된 것이 아니라고, 컴파일러마다 틀린 결과가 날수 있으니 1줄로 쓰지 말라고 여러줄로 보기쉽게 써라라고 언급을 합니다. 그런데 예전 남용하던 시절의 코드가 아직도 복사 붙여넣기 식으로 전래가 되고 있는 것입니다. while(n++) 이런 코드나, arr[idx++]=x; 이런식의 코드는 가끔 볼수 있는데요. 제가 설명한 대로 해석을 하시면 됩니다. 이 경우에는 ms, gcc 모두 같게 동작할거에요. 아마도 &=에 대한 처리가 ms와 gcc가 다른거 같네요. 알 수 없는 사용자 2022.5.28 22:37
    • 아.. 그래서 한줄로 쓰지 말라고 하신거군요.. 깊이 가르쳐주셔서 감사합니다 선생님... 모르는것을 깨달아서 머리가 맑아지는 기분이네요 방금 전 까지 너무 더웠는데 시원해지는 것 같아요 ㅠㅠ 이 맛에 개발쪽을 끊지 못하겠네요... 감사합니다 선생님 Magnolia97 2022.5.28 22:41

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)