>> [음악 재생]
DOUG 로이드 : 좋아.
이상한 주제의 종류, 오른쪽?
매직 넘버.
그 때 그는 무엇을 의미 미상 매직 넘버에 대해 이야기?
음, 프로그램의 일부 우리는 CS50로 작성했는지
지금까지 몇 가지 이상한 있었다 번호는 종류의 그들에 던져.
아마도 이유로 우리는하지 않습니다 완전히 지금은 이해합니다.
예를 들어, 마리오 문제에서, 우리 23 피라미드의 높이를 출장.
우리는 명시 적으로 말했다 보다 높은 23을 갈 수 없습니다.
>> 그러나 23는 무엇을 의미 하는가?
글쎄, 당신이 읽을 경우 신중을 스펙
알 수도 따라서 우리는 23를 덮인
되는 표준 높이 때문에 터미널 창 24입니다.
그리고 우리는이 그렇다면 피라미드는보다 키가 될,
그것은 이상한 일을 할 수 있습니다 여기서이를 화면을 실행.
당신이 알고, 무엇을 수행 그 오른쪽 맥락에서 의미?
>> 23 즉시 분명한의 의미는 누군가에게 누가 당신의 프로그램에서 보이는
어쩌면 다른이 크기 단자 창?
아마 아닙니다.
그것은 확인을 것 같다.
그럼, 왜 그냥 이하 23 이상이다?
일반적으로,이 종류의 나쁜 습관의 사실
코드에 상수를 작성합니다.
당신이 실제로 수행 할 때, 그렇게함으로써 코드에 상수를 작성,
그것은 사용라고도합니다 것 매직 넘버, 뭔가가
우리는 일반적으로 시도하고 피하고 싶어.
>> 예를 들어,이 살펴 보자 여기에이 간단한 함수에서.
물론 데이터가 없습니다 C의 유형은 카드 덱을했다.
그러니 나와 함께 곰.
그것은 약간의 의사는 여기에 혼합.
이것은라는 기능입니다 그 분명히 카드 거래
그것의 매개 변수로 갑판을 받아, 나에게 의지 출력 하나의 카드.
>> 그리고 여기 어디 뭔가를하고 있어요 , 0-52 실행 루프를 가지고
나는 카드를 처리합니다.
음, 우리는 마법을 가지고있어 여기에 숫자, 오른쪽.
당신은 매직 넘버가 무엇인지 볼 수 있나요?
또는 더 중요한 것은, 당신을 문제는 여기에 뭐가 있는지?
특히이 경우 하나의 기능입니다
자체 파일 이 들어있는 폴더
다른 한 무리의 파일, 각각의
한 벌의 카드에 다른 일을한다.
어쩌면 그것은 그들을 섞고, 또는 손을 거래 5 개의 카드 대신 하나의 카드.
>> 당신은 무엇을 보는가 문제는 여기에있을 수 있을까?
당신은 마법의 수를 볼 수 있나요 나는 코드에 주입 한?
그것은 바로, (52)이다.
>> 마찬가지로, 직관적으로 당신이 아마 알고, 확인을 클릭합니다.
표준 갑판처럼 카드는 52 카드가 포함되어 있습니다.
그러나 우리의 프로그램에서, 그것은 단지 가지 거기에 주위에 떠있는.
갑자기 52있다 같아.
>> 이 문제를 해결하는 한 가지 방법 문제는이 작업을 수행하는 것입니다.
우리는 지금 매우 명시 적있어 52 데크 크기를 부르고.
그것은 좀 더 직관적 준다 때 루프의 의미
우리는 그 다음 내가 말 이후에 갑판의 크기보다 작다.
그것은 단지 52 말보다 더 나은 것 같다.
지금이 실제로 문제를 해결 않습니다.
그것은 몇 가지 기호를 제공 않습니다 상수 의미한다.
그러나 그것은 종류의 실제로 수행 또 다른 문제를 소개합니다
그 즉시 명확하지 않을 수 있습니다.
심지어이 변수는 경우 globally-- 선언
당신은 무엇을 기억합니까 우리가 선언 할 때 의미
전 세계적으로 로컬 대 변수?
우리는 변수를 선언하더라도 전 세계적으로, 어떤이 있다면
다른 기능에 기능을 우리의 스위트 룸
카드 조작과 그 거래 그 실수, 갑판 크기를 변경
아니면 증가하여 1 또는 1을 감소시킨다.
그건 바로, 문제를 불러올 수도?
우리는 세트 상대하고 특히 경우 카드의 전체 갑판을 걸어 갔다 곳
필요합니다.
갑판의 크기는 감소되면 1, 예를 들면, 51,
우리는 실제로 셔플하지 않을 아마도 모든 카드.
우리는 그들 중 하나를 떠난다.
그리고 그 값은 아마도 수 예측 또는 나쁜 배우에 의해 악용.
>> C는라고 무슨 제공 처리기 지시문, 어떤
또한 매크로라고합니다 기호 상수를 작성.
그리고 사실, 당신은 이미했습니다 처리기 지시문을 본,
당신은 그것을 듣고하지 않은 경우에도 #INCLUDE와 그 불렀다.
이 매크로의 또 다른 예이다 또는 처리기 지시문.
>> 방법은 기호 상수를 만들려면 또는 상수에 이름을 부여
더이 너무 즉, 다음과 같다.
#DEFINE, 이름, 교체.
옆으로 정말 중요 여기 정말 빨리.
세미콜론을 넣지 마십시오 당신의 # 정의의 끝.
그래서 #DEFINE, 이름, 교체입니다.
>> 프로그램이 컴파일되면, 무엇 실제로 발생
가는 경우 컴파일러는 당신의 코드를 통해 이동합니다
과의 모든 인스턴스를 교체 무엇과 단어 "이름"을
대체했습니다.
유사하게, #INCLUDE 경우 종류 의 복사 및 붙여 넣기 유사,
다음 #DEFINE 일종이다 찾기 및 바꾸기 유사,
혹시에서 해당 기능을 사용 한 경우 워드 프로세싱 프로그램, 예를 들면.
>> 예를 들어, 그래서 3.14159265로 파이를 #define한다,
당신은 더 나은 수학적 있다면 경사하고 갑자기
3.14159265 비행 참조 주위에 당신의 코드에서,
당신은 아마 파이에 대해 얘기 알고있다.
하지만 어쩌면 우리는을 제공 할 수 있습니다 좀 더 상징적 의미.
그리고 우리는 대신 #DEFINE 말할 수 숫자의 입으로 파이
나는 계속 않을거야 것을 반복해서 읽고.
>> 그리고 무엇에 다음 일어날 프로그램이 경우 컴파일 시간이다
컴파일, 제일 먼저 그 일어날 것 그것을 통해 갈 것입니다
그것은 모든 시간을 대체합니다 그것은 자본 P, 자본 나는 본다
그것은 문자 그대로로 교체합니다 3.14 등등, 그래서 당신
그것은 모든를 입력 할 필요가 없습니다 시간이 여전히 프로그램 동안
기능이 당신을 당신이 최선을 다하고 있기 때문에, 기대
조작과, 곱셈, 이 파이가 무엇이든, 분할.
>> 당신은 이것에 한정되지 않는다 숫자 만에 대한 대체.
예를 들어, 나는 #define한다 수 문자열 CS50 등의 과정.
이 경우, 언제 프로그램은 컴파일,
#DEFINE는 통과합니다 코드마다 교체
그것은 문자열 CS50에 "물론"를 본다.
>> 여기서 알 수 있습니다 또한 내가 그 자주
#DEFINE 내 모든 기호 정의 상수는, 그래서, 말하자면
모두 대문자로 항상.
그것은 규칙입니다.
그것은 필요하지입니다.
그 이유는 일반적으로 사람이 사용 모두 대문자가 #define을 써서있어
그냥 정말 명확하게하는 것입니다 내 코드의 특정 요소
정의 된 상수이다.
이 소문자 인 경우, 그것은 가능성이 그것은 변수와 혼동 될 수 있습니다.
그리고 그것은 아마 좋은 일을 수행 할 수 없습니다.
>> 그래서이 특정 솔루션은 훨씬 더
이전의 것들 중 하나보다.
내가 처음 #DEFINE 데크 크기 (52), 다음의 경우 지금 여기에 (52), 또는 갑판 크기의 제 사용,
훨씬 더 직관적이고 많은 안전합니다.
당신은 상수를 조작 할 수 있습니다.
당신은 52 플러스 플러스 말할 수 없다.
즉 (53)로 변환 할 수 없을거야.
당신은 뭔가 (52)을 변경할 수 없습니다.
>> 당신은 변수를 변경할 수 있습니다 값이 52입니다,
이는 우리가 전에했던 첫 번째 수정했다.
그리고 당신은 증가시킬 수있다 (53)에 해당 변수.
하지만 당신은 52 플러스 플러스 말할 수 없다 갑자기 53로 (52)를 설정하는 것이 있습니다.
(52)는 항상 52입니다.
그래서 당신은 실수로 변경할 수 없습니다 여기를 조작하여 갑판 크기,
>> 또 다른 좋은 쪽 비록 이러한 효과가있다
당신이 알고있는 것을하지 세계의 모든 국가
크기 (52)의 한 벌의 카드를 사용할 수 있습니까?
예를 들어, 그것은 정말 흔한 독일, 32의 갑판 크기를 사용하는
그들은 일부를 제거 어디에 낮은 값 카드.
이 경우, I 포트 내 스위트 원
처리 기능 독일에 카드 조작.
나는 첫 번째 인스턴스의 수 우리 보여 가서 교체해야
(32) 내 코드 (52)의 모든 인스턴스.
>> 그러나 여기, 내가로 #define 경우 갑판 크기 내 코드의 맨 위쪽에 32,
나는 그것을 변경해야하는 경우, 내가 할 수있는 그냥 가서 그 한 가지를 변경합니다.
코드를 컴파일하고, 모든 갑작스런 그것은 통해 전파.
사실, 우리는 갑판을 변경할 수 있습니다 우리가 원하는 값으로 크기.
>> 나는 당신을 관심을 수 갑판 사이즈 픽업의 게임?
>> 나는 더그 로이드입니다.
그리고 이것은 CS50입니다.