인프런 커뮤니티 질문&답변

차희원님의 프로필 이미지
차희원

작성한 질문수

독하게 시작하는 C 프로그래밍

3항 연산자 필수 실습 문제 합 불 판단

해결된 질문

작성

·

41

·

수정됨

0

#include <stdio.h>

int main(void)

{

int nInput = 0;

int answer = 0;

 

scanf_s("%d", &nInput);

answer = (nInput >= 80) ? printf("pass") : printf("fail");

 

printf("%c\n", answer);

 

return 0;

}

 

이 코드가 왜 실행되는지 모르겠어요 문자열

 

%s가 아니라 왜 %c로 했는데 되는지 궁금해요

 

%s로 해도 실행은 되는데

 

이렇게 초록색 줄로 그이고 실행 했을 때 처리 속도도 느린데 왜 그런건가요?

 

answer에 printf 함수가 들어가면 어떻게 되는 건가요? 나중에 이런것도 설명 해주시나요?

답변 2

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

기본적인 내용은 인프런 AI 답변을 참고하시면 됩니다. 부족한 부분에 대해서만 설명을 드립니다.

char, short, int형은 모두 정수형입니다. C언어에서 %c 형식문자는 정수형 자료를 ASCII 코드로 변환해 출력합니다. answer는 int형 변수이므로 저장된 값을 ASCII 코드로 변환해 출력할 것입니다.

그런데 이 형식문자를 %s로 변경할 경우 answer 변수에 저장된 값을 메모리 주소로 해석하고 접근하게 됩니다. 이 경우 접근 할 수 없는 영역을 참조하려 시도할 가능이 있습니다. 녹색 줄이 표시된 이유는 이 때문입니다. 그 문제를 경고하고 있는 것입니다. 그럼에도 빌드 후 실행하면 다음과 같이 오류가 발생합니다.

image.png

 

속도가 느리다고 느낀 이유는 디버그 모드가 아닌 일반모드 실행 시 비정상 종료과정이 길어졌기 때문입니다.

그리고 'answer에 printf 함수가 들어간다'라는 말의 의미를 명확히 알 수가 없습니다. printf라는 것이 함수의 이름이며 주소이므로 int형 변수에 저장이 불가능한 것은 아니지만 이는 32비트 환경에서 가능한 것이고 64비트로 빌드할 경우 잘림이 발생합니다. 이에 대해서는 나중에 함수 포인터를 배울 때 알 수 있습니다. 참고하시기 바랍니다. 😄

0

안녕하세요, 인프런 AI 인턴입니다. 차희원님께서 질문하신 코드에 대한 설명을 드리겠습니다.

코드는 다음과 같습니다:

#include <stdio.h>

int main(void)
{
    int nInput = 0;
    int answer = 0;

    scanf_s("%d", &nInput);
    answer = (nInput >= 80) ? printf("pass") : printf("fail");
    printf("%c\n", answer);

    return 0;
}

코드를 분석해보면:

  1. Ternary Operator Usage:

    • (nInput >= 80) ? printf("pass") : printf("fail"); 이 부분은 nInput이 80 이상이면 "pass", 그렇지 않으면 "fail"을 출력하는 역할을 합니다. printf 함수는 출력한 문자열의 길이를 반환하므로, answer에 그 값을 저장합니다. 예를 들어, printf("pass")를 호출하면 4가 반환되고, printf("fail")을 호출하면 4가 반환됩니다.
  2. %c 사용:

    • printf("%c\n", answer);에서 %c는 문자 하나를 출력하는 형식 지정자입니다. 그런데 answer에는 printf 함수의 반환값인 정수가 들어있어요. 단일 문자로 출력하려다 보니 엉뚱한 문자가 출력될 수 있습니다.

알맞은 코드 수정:

  • answer 변수는 printf의 반환값을 문자로 해석하려고 하다 보니 논리적으로 어울리지 않습니다. 따라서 다음과 같이 printf 문을 각각 사용하면 명료합니다:
#include <stdio.h>

int main(void)
{
    int nInput = 0;
    
    scanf_s("%d", &nInput);
    if (nInput >= 80)
        printf("pass\n");
    else
        printf("fail\n");

    return 0;
}

추가 설명:

  • printf의 반환값은 단순히 출력한 문자 수입니다. 이를 문자로 취급하려는 printf("%c\n", answer); 구문은 비논리적입니다.
  • 여러분의 이해를 위해 printf의 반환값을 적절하게 활용하거나 필요하지 않다면 무시하는 것이 좋습니다.

이와 관련된 유사한 질문과 답변은 여기에서 확인하실 수 있습니다: [섹션10 연산자] 필수 실습 문제 합격, 불합격 판단하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

차희원님의 프로필 이미지
차희원

작성한 질문수

질문하기