변수(Variable)란?

프로그램 안에서 값을 기억해 두기 위한, 이름이 붙은 그릇. 정수형이나 실수형 등의 형을 선언하여 사용하며, 대입으로 값을 바꿔 쓴다. 새 값을 대입하면 이전 값은 사라진다.

일본어 명칭: 変数

변수(Variable)은(는) 프로그래밍의 기초(의사 코드 트레이스), 링커, 로더, 실행 파일, 멀티코어와 동기화 등 12개 분야의 연습 문제 78개에 나와요.

분야: 프로그래밍의 기초(의사 코드 트레이스)

도전해 보기: 변수(Variable) 관련 문제

최적화를 적용해 컴파일한 프로그램을 디버거로 조사하면 일부 변수의 값이 "표시할 수 없음"으로 나오는 경우가 있다. 주된 이유는 무엇인가?

  1. A최적화를 적용하면 디버거가 프로그램을 전혀 읽어 들이지 못하게 되기 때문
  2. B변수의 값이 컴파일할 때마다 무작위로 바뀌기 때문
  3. C값이 레지스터 재사용이나 계산의 삭제로 남아 있지 않기 때문
정답과 해설 보기

정답: C. 값이 레지스터 재사용이나 계산의 삭제로 남아 있지 않기 때문

최적화에서는 변수를 메모리에 두지 않고 레지스터만으로 다루다가, 다 쓰고 나면 그 레지스터를 다른 값에 재사용합니다. 상수 전파로 계산 자체가 사라지기도 합니다. 그래서 디버거로 멈춘 시점에는 이미 그 변수의 값이 어디에도 남아 있지 않은 경우가 있으며, "최적화로 삭제됨" 등으로 표시됩니다. 디버깅할 때는 최적화를 약하게 하거나 디버그용 최적화 설정을 사용하는 것이 일반적입니다. 디버거가 읽어 들이지 못하게 되는 것은 아닙니다.

C 언어에서 파일 바깥에 'int limit = 100;'이라고 쓴 전역 변수는 일반적으로 어느 섹션에 놓입니까?

  1. A.data(초기값이 있는 데이터)
  2. B.bss(초기값이 없는 데이터)
  3. C.text(기계어)
정답과 해설 보기

정답: A. .data(초기값이 있는 데이터)

0이 아닌 초기값을 가진 전역 변수나 정적 변수는 .data 섹션에 놓이며, 그 초기값이 파일 안에 저장됩니다. 프로그램을 읽어 들일 때 이 내용이 그대로 메모리에 복사되므로 main이 시작되는 시점에 limit은 100입니다. .data는 실행 중에 바뀔 수 있으므로 읽기와 쓰기가 허용된 영역이 됩니다.

해설 속 변수(Variable)

변수(Variable)이(가) 나오는 문제 (78)

  1. 최적화를 적용해 컴파일한 프로그램을 디버거로 조사하면 일부 변수의 값이 "표시할 수 없음"으로 나오는 경우가 있다. 주된 이유는 무엇인가?
  2. C 언어에서 파일 바깥에 'int limit = 100;'이라고 쓴 전역 변수는 일반적으로 어느 섹션에 놓입니까?
  3. 위의 전역 변수 중 일반적으로 .bss 섹션에 놓이는 것의 조합은 무엇입니까?
  4. C 언어 함수 안에서 선언한, static이 붙지 않은 지역 변수(자동 변수)는 실행 중 어디에 놓입니까?
  5. C 언어에서 초기값을 쓰지 않은 지역 변수와 전역 변수의 사용 시작 시 값에 대해 올바른 것은 무엇입니까?
  6. 두 개의 코어가 각자의 캐시에 변수 x의 사본을 가지고 있다. 코어 0이 x에 쓴 뒤 코어 1이 x를 읽을 때, 캐시 일관성 메커니즘이 없다면 일어날 수 있는 문제는 무엇입니까?
  7. 위 코드는 CAS(&p, 기대값, 새 값)를 사용하여 공유 변수 counter를 2배로 만들고 있다. CAS가 실패하여 루프를 재시도하는 것은 어떤 경우입니까?
  8. 스핀락에서 락 변수를 곧바로 원자적 명령으로 갱신하려 하지 않고, 평소에는 일반 읽기로 풀리기를 기다리다가 풀린 것으로 보일 때만 원자적 명령을 사용하는(test-and-test-and-set) 이유로 올바른 것은 무엇입니까?
  9. C 언어에서 스레드 간에 주고받는 플래그 변수에 volatile을 붙이는 것만으로는 동기화로 불충분한 이유로 올바른 것은 무엇입니까?
  10. 8비트 마이크로컨트롤러에서 타이머 인터럽트가 32비트 변수 ticks를 1씩 증가시키고, 메인 처리가 ticks를 읽어 경과 시간을 구하고 있습니다. 드물게 크게 어긋난 값이 읽히는 원인으로 올바른 것은 무엇입니까?
  11. 세 변수의 값을 차례로 보내는 다음 프로그램을 실행한 후의 a, b, c의 값의 조합은?
  12. 안쪽 반복의 초기값이 바깥쪽 변수 i로 정해지는 다음 이중 루프를 실행한 후의 c의 값은?
  13. ÷는 나눗셈이며, 정수형 변수(인수 포함)에 대입할 때는 소수점 이하를 버린다. 다음 함수 f를 f(9087)로 호출했을 때의 반환값은?
  14. ÷는 나눗셈이며, 정수형 변수(인수 포함)에 대입할 때는 소수점 이하를 버린다. 다음 함수 toBin을 toBin(12)로 호출했을 때의 반환값은?
  15. ÷는 나눗셈이며, 정수형 변수(인수 포함)에 대입할 때는 소수점 이하를 버린다. 다음 함수 pow를 pow(2, 10)으로 호출했을 때, pow가 호출되는 횟수(최초 호출 포함)는?

관련 용어

스택(Stack) 배열(Array) 인수(Argument) 재귀(Recursion) 포인터(Pointer) 마이컴(마이크로컨트롤러) 반환값(Return Value) 캐시 라인(Cache Line) 링커(linker) volatile(형 한정자)

용어집으로 돌아가기