[음악 재생] 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입니다.