본문 바로가기
XR개발/C언어

02_Q&A C언어에서 scanf, double에 대한 물음.zip

by 오머리쿠_OmaryKoo 2025. 1. 21.

Q1. 여기서 왜 scanf %lf 끼리는 사이에 ','가 없고, %num1, %num2 끼리는 사이에 ','가 있어야 하는가?

scanf의 형식 지정자와 변수 이름 간의 구분은 C 언어의 문법에 따라 다르다. 

 

1. scanf에서 형식 지정자와 변수를 연결하는 방식

scanf는 문자열 형식 지정자(%lf, %d 등)를 통해 입력을 읽고, 해당 데이터를 저장할 변수의 메모리 주소를 전달받는다.

  • 각 형식 지정자(%lf, %d 등)는 입력값을 읽어들이는 역할을 한다.
  • 변수는 이 값을 저장하기 위한 메모리 주소를 지정하기에, 따라서 각 형식 지정자 뒤에는 대응하는 변수의 주소를 지정해야 한다.
  • %lf는 하나의 실수를 읽기 위한 형식 지정자이다.
  • &num1, &num2, &num3는 각각 읽은 데이터를 저장할 메모리 주소다.
  • 변수 사이에 쉼표(,)를 넣어주는 이유는 함수 호출 시 인수를 나열하는 C 문법의 요구사항이다.

 

2. 왜 형식 지정자 간에는 쉼표(,)가 없는가?

형식 지정자는 단순히 scanf 함수에 전달되는 문자열의 일부다. 이 문자열은 scanf가 읽어들일 입력 데이터의 형식을 정의한다.

  • 형식 지정자는 연속된 문자열로 작성되어야 하며, 쉼표나 다른 기호를 넣으면 scanf는 이를 데이터로 간주하거나 잘못된 형식으로 인식한다.
  • 예를 들어, 아래와 같이 작성하면 오류가 발생합니다:여기서 %lf,와 같은 형식은 입력값에 실제로 쉼표를 포함하도록 요구합니다. 즉, 사용자가 숫자 사이에 쉼표를 입력해야만 제대로 동작한다:
     
    scanf("%lf, %lf, %lf", &num1, &num2, &num3);
  • 그러나 원하는 입력이 공백으로 구분된 숫자라면, 쉼표를 형식 지정자에 포함시키지 않아야 한다:
     
    scanf("%lf %lf %lf", &num1, &num2, &num3);

 

3. 왜 변수 간에는 쉼표가 있어야 하는가?

쉼표는 C 언어에서 함수 호출 시 여러 인수를 구분하는 표준 문법이다. scanf는 여러 개의 형식 지정자를 처리할 때, 해당 데이터가 저장될 변수들의 주소를 순서대로 나열해야 한다.

scanf("%lf %lf %lf", &num1, &num2, &num3);
  • %lf는 첫 번째 입력값의 형식을 정의하고, &num1은 이를 저장할 변수의 주소를 제공한다.
  • 두 번째와 세 번째 입력값도 같은 방식으로 처리된다.

쉼표가 없으면 컴파일러는 이를 잘못된 함수 호출로 간주하며 오류를 발생시킨다.

 

4. 정리

  • 형식 지정자 간에는 쉼표가 필요하지 않다.
    • 형식 지정자는 단순히 입력값의 형식을 설명하는 문자열의 일부일 뿐이다.
    • 쉼표를 넣으면 입력값에 쉼표가 포함되어야 하는 형식으로 변경된다.
  • 변수 간에는 쉼표가 필요하다.
    • C 언어의 함수 호출 문법에서 여러 인수를 구분하기 위해 쉼표를 사용해야 한다.

Q2. 궁금한 건, 선언할 때, 위의 이미지에서는 둘레, 넓이, w, h에서는 모두 하나의 double에서 선언한 반면, 우측에 있는 이미지에서는 num1, num2, num3는 동일하나, 나머지 sum과 avg는 또 별개의 double에서 선언했는데, 왜 그런건가? 꼭 별개로 선언할 필요가 없는 건 아닌가?

두 코드에서 변수 선언 방식이 다른 이유는 코드 작성자의 스타일, 가독성, 그리고 논리적 그룹화와 관련이 있다. 변수를 하나의 선언에서 묶거나, 별도로 선언하는 것은 꼭 특정한 규칙이 있어서라기보다는 상황과 설계 의도에 따라 달라진다.

 

1. 첫 번째 코드에서 하나의 double로 묶은 이유

  • 이 코드에서는 넓이(area)와 둘레(perimeter)가 같은 사각형의 특성과 관련된 값들이기 때문에 한 줄로 묶어 선언한 것으로 보인다.
  • 이렇게 하면:
    • 코드가 더 간결해 보인다.
    • 논리적으로 관련된 변수(사각형의 폭, 높이, 넓이, 둘레)를 한 번에 선언함으로써, 가독성과 직관성을 높일 수 있다.
  • 예를 들어, w, h, perimeter, area는 모두 사각형의 속성에 해당하므로, 한 줄로 묶는 것이 자연스럽다.

 

2. 두 번째 코드에서 별도로 선언한 이유

  • 여기서는 입력받은 숫자(num1, num2, num3)와 그 결과값(sum, avg)가 논리적으로 다른 그룹으로 볼 수 있다.
  • num1, num2, num3는 사용자 입력값이고, sum과 avg는 계산 결과값이다.
    • 따라서 작성자는 입력값과 결과값을 분리하여 선언하는 방식을 선택했을 가능성이 높다.
  • 이렇게 하면:
    • 코드의 의도를 더 명확히 표현할 수 있다.
    • num1, num2, num3는 같은 그룹으로 묶고, sum과 avg를 다른 그룹으로 선언해 변수의 역할과 그룹화가 더 직관적으로 보인다.

 

3. 꼭 별개로 선언할 필요가 있는가?

꼭 별개로 선언할 필요는 없다. 두 번째 코드도 아래처럼 작성할 수 있다:

  • 위처럼 한 줄로 묶어도 컴파일러는 같은 방식으로 처리하나 아무런 차이가 없다.
  • 그러나 가독성과 유지보수성 관점에서 변수의 역할과 그룹이 명확하게 나뉘는 편이 좋기 때문에, 작성자는 이를 구분하여 선언했을 가능성이 크다.

 

4. 변수를 묶거나 별도로 선언할 때의 기준

  • 같은 논리적 그룹인지 확인:
    • 관련 있는 값들(예: 사각형의 속성들)을 묶는 것이 좋다.
    • 논리적으로 다른 역할을 하는 값(예: 입력값과 계산값)은 분리하는 것이 가독성에 유리하다.
  • 가독성과 유지보수성:
    • 한 줄에 너무 많은 변수를 묶으면 가독성이 떨어질 수 있다.
    • 반대로, 불필요하게 나누는 것도 코드가 장황해질 수 있다.
  • 코드 스타일:
    • 팀의 코딩 스타일 가이드에 따라 달라질 수 있다. 일관성을 유지하는 것이 중요하다.
728x90