요약
이 수업은 식과 그 연산자를 다루는, 강좌의 세 번째 단원을 연다. 수업은 단원의 목적을 설명한다. 곧, 어떤 연산이 먼저 이루어지는지, 결과가 어떤 자료형인지, 어떤 부수 효과가 있는지, 어떤 식이 의미를 갖지 않는지를 알고서, 값을 확실하게 예측할 수 있는 식을 만드는 법을 가르치는 것이다. 또 단원의 네 수업과, 정수와 실수의 산술에서 비트와 수학 라이브러리에 이르기까지, 조건과 정의되지 않은 동작의 목록을 거치며 그 수업들을 잇는 실을 소개하고, 단원이 두 번째 단원에서 이미 안다고 전제하는 것, 곧 각 데이터의 자료형과 그 한계와 그 변환을 되짚는다. 그리고 단원이 해결하는 문제, 곧 경고 하나 없이 컴파일되는데도 여섯 가지 학교 수학 질문에 대한 답이 모두 틀리거나 아예 나오지 않는 프로그램의 문제를 제시하고, 단원이 뒤의 단원들과 C++ 프로그래밍 II 강좌에서 어디로 이어지는지 보여 준다.
학습 목표
- 단원 내용의 순서를 서술하고, 각 수업이 그 뒤의 수업에 무엇을 보태는지 설명한다.
- 2단원에서 필요한 것(정수 자료형과 실수 자료형, 그 값의 범위, 오버플로, 형 변환)을 떠올리고, 필요하면 복습한다.
- 하나의 예로, 식의 값이 계산 규칙(우선순위, 피연산자의 자료형, 효과의 순서)에 달려 있으며 그 규칙이 학교 수학의 규칙과 늘 일치하지는 않는다는 것을 미리 내다본다.
- 단원을 마칠 때 할 줄 알아야 하는 것을 확인하고, 그것을 뒤의 단원들에서 배울 것과 구별한다.
입문 평가
단원을 시작하기 전에 출발점을 재어 두면 좋다. 이 평가는 자기 평가이며 점수를 매기지 않는다. 목적은 오직 학습의 방향을 잡는 데 있다. 처음 네 문항은 단원이 두 번째 단원에서 이미 안다고 전제하는 것을 확인한다. 정수끼리의 나눗셈, 이진법 표기, 부호 없는 뺄셈, 그리고 부호 있는 오버플로이다. 그 뒤의 여섯 문항은 수업 순서대로 단원의 핵심 개념을 다루며, 그중 몇 문항은 학교 수학이나 기초 논리에서 출발한다. 아직 맞힐 의무는 누구에게도 없으며, 그중 두 문항에서는 “아직 모르겠다”가 정직한 답이다. 맞든 틀리든 모든 답이 요점을 설명하고 그 요점을 다루는 수업을 알려 주기 때문이다. 같은 능력은 단원 끝의 종합 수업에서 다시 측정한다.
단원을 시작하기 전에 출발점을 확인해 보세요. 짧은 자기 평가입니다. 점수가 매겨지지 않으며 결과는 브라우저에만 저장됩니다.
문제 1이전 단원에서어떤 프로그램이
const double r{7 / 2};선언을 하고r변수를 출력한다. 무엇이 나타나는가?변수의 자료형이 나눗셈 방식을 정한다고 생각한다. 그것을 정하는 것은 피연산자의 자료형이다.정수 나눗셈이 반올림한다고 생각한다. 실제로는 소수 부분을 버린다.값 3은 상수이며double타입에서 정확히 표현된다. 거부해야 할 축소는 없다.나눗셈7 / 2식은 정수끼리의 나눗셈이어서 정수 몫 3을 준다. 그 3이double타입으로 변환되는 것은 그 뒤의 일이다. 연산을 정하는 것은 피연산자의 자료형이지, 결과를 받는 변수의 자료형이 아니다. 3.1강은 이 관찰을 일반 규칙으로 바꾼다. 자료형은 식의 각 노드에서 정해진다.문제 2이전 단원에서수 13을 8비트 이진법으로 쓰면 어떻게 되는가?
가중치를 잘못 더했다. .연속 나눗셈의 나머지를 나온 순서대로 썼다. 나머지는 마지막 것에서 첫 것으로 읽는다.이 비트 배열은 26, 곧 13의 두 배이다. 비트가 한 자리 밀려 있다.각 자리의 가중치는 바로 오른쪽 자리의 두 배이다. 1은 가중치 8, 4, 1의 자리를 차지한다. 3.4강은 이 비트들을 직접 다루므로, 막힘없이 읽을 수 있어야 좋다.복습: 정수와 그 표현
문제 3이전 단원에서32비트
unsigned int타입에서std::println("{}", 0u - 1);문장은 무엇을 출력하는가?접미사u기호를 고려하지 않았다. 부호 없는 자료형에는 음수가 없다.법 에 대해 정의된 부호 없는 산술을 부호 있는 오버플로와 혼동한다.뺄셈이 자료형의 가장 작은 값에서 멈춘다고 생각한다. 실제로는 한 바퀴 돌아간다.부호 없는 산술은 법 산술이다. . 결과는 정의되어 있고, 그래서 어떤 새니타이저도 이를 보고하지 않는다. 단원은 혼합된 식의 형 변환과, 부호 없는 자료형으로 쓰는 비트 연산자에서 이것을 다시 만난다.복습: 정수와 그 표현
문제 4이전 단원에서어떤 프로그램이
int count{std::numeric_limits<int>::max()};문장을 실행한 뒤count = count + 1;문장을 실행한다. 표준은count변수의 값에 대해 무엇을 보장하는가?가끔 관찰되는 것과 표준이 보장하는 것을 혼동한다. 최솟값으로 돌아가는 것은 부호 없는 자료형의 동작이지, 부호 있는 자료형의 동작이 아니다.자료형의 한계를 무시한다. 이 수는 32비트int타입에 들어가지 않는다.컴파일러는 프로그램이 실행될 때 가질 값을 알지 못한다. 거의 언제나 아무 말 없이 컴파일한다.덧셈에는 결과가 자료형에 들어간다는 사전 조건이 있으며, 그 밖에서는 표준이 아무것도 약속하지 않는다. 강좌의 새니타이저는 프로그램을 멈춘다. 새니타이저가 없으면 무엇이든 출력될 수 있다. 3.3강은 이 경우를 같은 종류의 다른 경우들과 함께 하나의 목록으로 모은다.복습: 정수와 그 표현
문제 5 및 의 값은 각각 얼마인가?
곱의 우선순위를 무시하고 왼쪽에서 오른쪽으로 계산한다.두 번째 식의 괄호를 무시한다.각 식에 다른 식의 값을 붙였다. 괄호의 효과를 거꾸로 적용한다.곱은 합보다 강하게 결합한다. 에서는 곱셈을 먼저 하고, 괄호는 그 순서를 바꾼다. C++도 같은 약속을 따르며, 3.1강은 식 트리를 도구로 삼아 이 약속을 나눗셈, 나머지, 결합 방향으로 넓힌다.복습: 산술 연산
문제 6수학의 나눗셈 정리에 따라 나머지 에 의 조건을 둘 때, 몫 및 나머지 ( 나누기 의 경우)의 값은 각각 얼마인가?
C++가 계산하는 값이지만, 의 조건을 만족하지 않는다. 수학의 나머지는 음수가 아니다.등식을 확인하지 않았다. 의 결과일 뿐, 에 이르지 않는다.이것도 등식을 만족하지 않는다. .정리가 요구하는 것은 의 등식과 의 조건이며, 이 두 수만이 그것을 만족한다. 반면 C++는 몫을 0 쪽으로 버린다.-7 / 2식의 값은 ,-7 % 2식의 값은 의 값이다. 3.1강은 그 차이를 설명하고, C++의 나머지에서 수학의 나머지를 얻는 법을 가르친다.복습: 산술 연산
문제 7“비가 오고 춥다”의 부정은 무엇인가?
연결사를 바꾸지 않고 각 부분을 부정했다. 이것은 부정보다 훨씬 많은 것을 주장한다. 비가 오지 않고 추운 날까지 배제하기 때문이다.한 부분만 부정했다.두 번째 선택지와 같은 것을 말하며, 오류도 같다.연언의 부정은 부정들의 선언이다. 이것이 드모르간 법칙의 하나이다. 둘 중 하나만 빠져도 그 주장은 거짓이 된다. 3.2강은 같은 법칙을 프로그램의 조건에 적용한다.복습: 관계와 논리
문제 8
std::println("{}", 3 < 5);문장은 무엇을 출력하는가?논리값이 수로 출력된다고 생각한다. 자리표시자{}기호를 쓰면std::println함수는 단어를 출력한다.식이 텍스트로 출력된다고 생각한다. 출력되는 것은 식의 값이다.값이다. 비교는bool타입의 식이다.비교도 다른 모든 식과 같은 식이다.bool타입의 값을 가지며,std::println함수는 그 값을true또는false단어로 출력한다. 3.2강은 이 관찰에서 출발한다. 조건은 계산되는 것이고, 그래서 우선순위와 트리와 대수를 가진다.복습: 관계와 논리
문제 9
int a{5};문장과int b{a++ * 2};문장 뒤에a변수와b변수의 값은 각각 얼마인가?정직한 답이다. 3.3강에서 식의 값과 효과의 차이를 배우며, 마무리 평가에서 다시 묻는다.효과를 잊었다.a++표현은a변수를 증가시킨다.a변수의 새 값을 썼다. 후위 증가는 증가 전의 값을 준다.a++식에는 값, 곧a변수가 가지고 있던 값(5)과,a변수를 6으로 만드는 효과가 있다. 곱은 효과가 아니라 값을 쓴다. 3.3강은 이 둘을 구별하는 법과, 한 식 안의 두 효과가 그 식에서 의미를 빼앗는 때를 알아보는 법을 가르친다.문제 10
std::println("{}", 2 ^ 3);문장은 무엇을 출력하는가?정직한 답이다. 3.4강에서 설명하며, 마무리 평가에서 다시 묻는다.많은 계산기의 표기에서처럼 캐럿을 거듭제곱으로 읽었다. C++에서는 그렇지 않다.곱으로 읽었다.C++에서 캐럿은 거듭제곱이 아니라 비트 XOR이다. , 두 수는 가중치 1의 비트에서만 다르므로 결과는 1이다. C++에는 거듭제곱 연산자가 없다. 3.4강에서std::pow함수를 쓸 때와 시프트를 쓸 때를 배운다.복습: 비트와 수학 라이브러리
콘텐츠를 불러오는 중…