1 00:00:00,000 --> 00:00:02,350 >> [MUSIC CHƠI] 2 00:00:02,350 --> 00:00:05,444 3 00:00:05,444 --> 00:00:06,360 DOUG LLOYD: Tất cả các quyền. 4 00:00:06,360 --> 00:00:07,770 Loại một chủ đề kỳ lạ, phải không? 5 00:00:07,770 --> 00:00:09,050 Magic số. 6 00:00:09,050 --> 00:00:12,012 Doe những gì ông có nghĩa là khi anh ấy nói về con số ma thuật? 7 00:00:12,012 --> 00:00:14,220 Vâng, một số chương trình mà chúng tôi đã viết trong CS50 8 00:00:14,220 --> 00:00:16,660 đến nay đã có một số lạ số loại ném vào chúng. 9 00:00:16,660 --> 00:00:19,680 Có lẽ vì lý do chúng tôi không hoàn toàn hiểu ngay bây giờ. 10 00:00:19,680 --> 00:00:23,950 Ví dụ, trong các vấn đề Mario, chúng tôi mũ chiều cao của kim tự tháp ở tuổi 23. 11 00:00:23,950 --> 00:00:26,880 Chúng tôi nói rõ ràng rằng bạn không thể đi cao hơn 23. 12 00:00:26,880 --> 00:00:28,702 >> Nhưng những gì hiện 23 nghĩa là gì? 13 00:00:28,702 --> 00:00:30,410 Vâng, nếu bạn đọc spec cẩn thận, bạn 14 00:00:30,410 --> 00:00:32,493 có thể đã thấy rằng Lý do chúng tôi giới hạn nó ở 23 15 00:00:32,493 --> 00:00:36,160 là bởi vì chiều cao tiêu chuẩn của một cửa sổ terminal là 24. 16 00:00:36,160 --> 00:00:38,860 Và như vậy, nếu chúng ta có kim tự tháp là cao hơn, 17 00:00:38,860 --> 00:00:41,290 nó có thể làm điều này lạ nơi nó chạy ra khỏi màn hình. 18 00:00:41,290 --> 00:00:45,140 Và bạn có biết, những gì hiện đó có nghĩa là trong bối cảnh, phải không? 19 00:00:45,140 --> 00:00:48,880 >> Là ý nghĩa của 23 ngay lập tức rõ ràng để ai đó nhìn vào chương trình của bạn 20 00:00:48,880 --> 00:00:51,550 và có thể có một khác nhau kích thước cửa sổ terminal? 21 00:00:51,550 --> 00:00:52,330 Chắc là không. 22 00:00:52,330 --> 00:00:53,080 Nó có vẻ như, OK. 23 00:00:53,080 --> 00:00:55,005 Vâng, lý do tại sao nó chỉ ít hơn 23 là? 24 00:00:55,005 --> 00:00:56,880 Nói chung, đó là loại một thói quen xấu thực 25 00:00:56,880 --> 00:00:58,940 để viết các hằng số vào mã của bạn. 26 00:00:58,940 --> 00:01:02,190 Khi làm như vậy, khi bạn thực sự làm viết một hằng số vào mã của bạn, 27 00:01:02,190 --> 00:01:05,630 nó đôi khi được gọi như sử dụng con số kỳ diệu, đó là cái gì 28 00:01:05,630 --> 00:01:08,030 chúng ta thường muốn cố gắng và tránh. 29 00:01:08,030 --> 00:01:12,830 >> Ví dụ, chúng ta hãy có một cái nhìn tại chức năng này đơn giản ở đây. 30 00:01:12,830 --> 00:01:15,726 Rõ ràng là không có dữ liệu loại trong C được gọi là thẻ hoặc boong. 31 00:01:15,726 --> 00:01:16,600 Vì vậy, chỉ cần chịu với tôi. 32 00:01:16,600 --> 00:01:18,910 Đó là một chút giả trộn lẫn ở đây. 33 00:01:18,910 --> 00:01:21,050 Đây là một chức năng gọi là đối phó thẻ mà dường 34 00:01:21,050 --> 00:01:26,570 mất một boong như tham số của nó, và chúc đầu ra cho tôi một thẻ duy nhất. 35 00:01:26,570 --> 00:01:30,990 >> Và tôi đang làm một cái gì đó ở đây, nơi tôi có một vòng lặp chạy 0-52, 36 00:01:30,990 --> 00:01:33,394 và tôi đối phó thẻ. 37 00:01:33,394 --> 00:01:35,310 Vâng, chúng tôi đã có một kỳ diệu số ở đây, phải. 38 00:01:35,310 --> 00:01:38,790 Bạn có thấy những gì các con số kỳ diệu là? 39 00:01:38,790 --> 00:01:42,280 Và quan trọng hơn, làm bạn thấy vấn đề là gì đây? 40 00:01:42,280 --> 00:01:44,310 Đặc biệt nếu điều này chỉ là một chức năng 41 00:01:44,310 --> 00:01:48,030 trong tập tin riêng của mình trong một thư mục chứa 42 00:01:48,030 --> 00:01:49,970 một bó khác nhau file, mỗi trong số đó 43 00:01:49,970 --> 00:01:51,670 làm một điều cần một cỗ bài. 44 00:01:51,670 --> 00:01:57,310 Có lẽ nó lê bước họ, hoặc giao một bàn tay năm thẻ thay vì một thẻ duy nhất. 45 00:01:57,310 --> 00:01:59,420 >> Bạn có thấy những gì vấn đề có thể có mặt ở đây? 46 00:01:59,420 --> 00:02:03,220 Bạn có thấy những con số kỳ diệu Tôi đã tiêm vào các mã? 47 00:02:03,220 --> 00:02:04,390 Đó là 52, phải. 48 00:02:04,390 --> 00:02:06,440 >> Giống như, trực giác bạn có thể biết, OK. 49 00:02:06,440 --> 00:02:09,740 Giống như một cỗ tiêu chuẩn của thẻ chứa 52 thẻ. 50 00:02:09,740 --> 00:02:12,570 Nhưng trong chương trình của chúng tôi, nó chỉ loại trôi nổi xung quanh trong đó. 51 00:02:12,570 --> 00:02:15,280 Nó giống như tất cả của một đột ngột có một 52. 52 00:02:15,280 --> 00:02:18,290 >> Một cách để giải quyết điều này vấn đề là để làm điều này. 53 00:02:18,290 --> 00:02:22,724 Chúng tôi rất rõ ràng bây giờ gọi ra kích thước boong là 52. 54 00:02:22,724 --> 00:02:25,390 Nó cung cấp cho nó trực quan hơn một chút có nghĩa là khi trong vòng lặp for 55 00:02:25,390 --> 00:02:28,650 sau này thì chúng ta nói, i là ít hơn so với kích thước boong. 56 00:02:28,650 --> 00:02:32,666 Nó chỉ có vẻ tốt hơn vì nói 52. 57 00:02:32,666 --> 00:02:34,290 Bây giờ điều này không thực sự sửa chữa các vấn đề. 58 00:02:34,290 --> 00:02:38,460 Nó đưa ra một số biểu tượng nghĩa là hằng số. 59 00:02:38,460 --> 00:02:40,820 Nhưng nó thực sự loại giới thiệu một vấn đề khác 60 00:02:40,820 --> 00:02:43,770 mà có thể không được ngay lập tức rõ ràng. 61 00:02:43,770 --> 00:02:45,859 Thậm chí nếu biến này được khai báo globally-- 62 00:02:45,859 --> 00:02:47,650 ông có nhớ những gì nó có nghĩa là khi chúng ta khai báo 63 00:02:47,650 --> 00:02:50,500 một biến trên toàn cầu so với địa phương? 64 00:02:50,500 --> 00:02:53,340 Ngay cả nếu chúng ta khai báo một biến trên toàn cầu, những gì nếu có 65 00:02:53,340 --> 00:02:55,500 một chức năng trong bộ phần mềm của chúng tôi các chức năng 66 00:02:55,500 --> 00:02:59,750 mà đối phó với thao tác thẻ mà vô tình thay đổi kích thước boong, 67 00:02:59,750 --> 00:03:02,727 hoặc nó làm tăng nó bằng 1 hoặc tăng thêm 1. 68 00:03:02,727 --> 00:03:04,060 Điều đó có thể chính tả khó khăn, phải không? 69 00:03:04,060 --> 00:03:08,261 Đặc biệt là nếu chúng ta đang đối phó với một bộ thẻ nơi xáo trộn đầy đủ các boong 70 00:03:08,261 --> 00:03:08,760 bắt buộc. 71 00:03:08,760 --> 00:03:12,804 Nếu kích thước boong được giảm bằng 1, ví dụ, đến 51, 72 00:03:12,804 --> 00:03:14,970 chúng ta không thực sự xáo trộn tất cả các thẻ có thể. 73 00:03:14,970 --> 00:03:16,500 Chúng tôi đang để lại một trong số họ ra. 74 00:03:16,500 --> 00:03:21,680 Và giá trị mà có lẽ có thể được dự báo hoặc khai thác bởi một diễn viên tồi. 75 00:03:21,680 --> 00:03:24,920 >> C cung cấp những gì được gọi là một chỉ thị tiền xử lý, trong đó 76 00:03:24,920 --> 00:03:27,764 cũng được gọi là một vĩ mô cho tạo hằng số tượng trưng. 77 00:03:27,764 --> 00:03:30,180 Và trên thực tế, bạn đã đã nhìn thấy một chỉ thị tiền xử lý, 78 00:03:30,180 --> 00:03:32,916 thậm chí nếu bạn không có nghe nói nó gọi đó bằng #include. 79 00:03:32,916 --> 00:03:37,150 Đó là một ví dụ khác của một vĩ mô hoặc chỉ thị tiền xử lý. 80 00:03:37,150 --> 00:03:41,290 >> Cách để tạo ra các hằng số tượng trưng, hoặc đưa ra một tên cho một hằng số 81 00:03:41,290 --> 00:03:43,740 do đó nó có nhiều hơn có nghĩa, là như sau. 82 00:03:43,740 --> 00:03:47,030 #define, tên, thay thế. 83 00:03:47,030 --> 00:03:49,140 Thực sự quan trọng sang một bên đây thực sự nhanh chóng. 84 00:03:49,140 --> 00:03:54,180 Không đặt một dấu chấm phẩy ở cuối # định nghĩa của bạn. 85 00:03:54,180 --> 00:03:57,310 Vì vậy, nó #define, tên, thay thế. 86 00:03:57,310 --> 00:03:59,540 >> Khi chương trình được biên soạn, những gì thực sự xảy ra 87 00:03:59,540 --> 00:04:01,740 là trình biên dịch nếu đi đi qua mã của bạn 88 00:04:01,740 --> 00:04:06,770 và thay thế mọi chữ "tên" với bất cứ điều gì bạn 89 00:04:06,770 --> 00:04:08,860 đặt thay thế. 90 00:04:08,860 --> 00:04:13,060 Tương tự, nếu #include là loại tương tự để sao chép và dán, 91 00:04:13,060 --> 00:04:15,700 sau đó # xác định là loại tương tự để tìm và thay thế, 92 00:04:15,700 --> 00:04:19,180 nếu bạn đã từng sử dụng tính năng trong một Chương trình xử lý văn bản, ví dụ. 93 00:04:19,180 --> 00:04:26,345 >> Vì vậy, ví dụ, nếu tôi # define pi như 3.14159265, 94 00:04:26,345 --> 00:04:28,720 nếu bạn là tốt hơn về mặt toán học nghiêng và bạn đột nhiên 95 00:04:28,720 --> 00:04:31,640 xem 3.14159265 bay xung quanh trong mã của bạn, 96 00:04:31,640 --> 00:04:33,517 bạn có thể biết nó nói về pi. 97 00:04:33,517 --> 00:04:35,850 Nhưng có lẽ chúng ta có thể cung cấp cho nó một ít có ý nghĩa tượng trưng hơn. 98 00:04:35,850 --> 00:04:39,850 Và chúng ta có thể thay vì nói #define pi như ngụm số 99 00:04:39,850 --> 00:04:42,110 rằng tôi sẽ không giữ đọc hơn và hơn. 100 00:04:42,110 --> 00:04:45,560 >> Và điều gì sẽ xảy ra sau đó tại thời gian biên dịch là khi chương trình được 101 00:04:45,560 --> 00:04:48,530 biên soạn, điều đầu tiên mà sẽ xảy ra là nó sẽ đi qua 102 00:04:48,530 --> 00:04:51,520 và nó sẽ thay thế tất cả các thời gian nó thấy vốn P, vốn tôi, 103 00:04:51,520 --> 00:04:55,610 nó theo nghĩa đen sẽ thay thế nó với 3,14 và như vậy, do đó bạn 104 00:04:55,610 --> 00:04:58,090 không cần phải gõ nó mỗi thời gian trong khi chương trình của bạn vẫn còn 105 00:04:58,090 --> 00:05:00,631 có các chức năng mà bạn mong đợi, bởi vì bạn đang làm việc 106 00:05:00,631 --> 00:05:05,090 với thao tác, nhân, phân chia, bất cứ điều gì nó là của pi. 107 00:05:05,090 --> 00:05:08,230 >> Bạn không có giới hạn này thay cho chỉ số. 108 00:05:08,230 --> 00:05:12,279 Ví dụ, tôi có thể # define Tất nhiên như chuỗi CS50. 109 00:05:12,279 --> 00:05:14,070 Trong trường hợp này, khi Chương trình được biên soạn, 110 00:05:14,070 --> 00:05:16,236 #define sẽ đi qua mã, thay thế mỗi khi 111 00:05:16,236 --> 00:05:19,900 nó thấy "tất nhiên" với chuỗi CS50. 112 00:05:19,900 --> 00:05:21,720 >> Bạn sẽ nhận thấy ở đây còn mà tôi thường xuyên 113 00:05:21,720 --> 00:05:26,090 #define tất cả các định nghĩa của tôi biểu tượng hằng số, do đó, để nói chuyện, 114 00:05:26,090 --> 00:05:28,130 luôn trong tất cả các mũ. 115 00:05:28,130 --> 00:05:28,960 Đó là một quy ước. 116 00:05:28,960 --> 00:05:30,170 Nó không cần thiết. 117 00:05:30,170 --> 00:05:33,900 Lý do thông thường mọi người sẽ sử dụng tất cả các thủ đô khi họ đang #defining 118 00:05:33,900 --> 00:05:37,590 chỉ là để làm cho nó thực sự rõ ràng Yếu tố này đặc biệt của mã của tôi 119 00:05:37,590 --> 00:05:38,820 là một hằng số được xác định. 120 00:05:38,820 --> 00:05:43,730 Nếu nó là chữ thường, nó có thể là nó có thể bị nhầm lẫn với một biến. 121 00:05:43,730 --> 00:05:46,120 Và có lẽ đó không phải là một điều tốt để làm. 122 00:05:46,120 --> 00:05:48,910 >> Vì vậy, điều này đặc biệt Giải pháp là tốt hơn nhiều 123 00:05:48,910 --> 00:05:50,550 so với cả những người trước đây. 124 00:05:50,550 --> 00:05:59,950 Nếu tôi #define đầu boong kích thước 52, sau đó Hiện tại tôi sử dụng 52, hoặc kích thước boong ở đây, 125 00:05:59,950 --> 00:06:01,850 là rất nhiều trực quan hơn và an toàn hơn rất nhiều. 126 00:06:01,850 --> 00:06:03,280 Bạn không thể thao tác một hằng số. 127 00:06:03,280 --> 00:06:05,259 Bạn không thể nói 52 cộng với cộng với. 128 00:06:05,259 --> 00:06:06,800 Đó không phải đi để chuyển đổi nó đến 53. 129 00:06:06,800 --> 00:06:09,390 Bạn không thể thay đổi từ 52 đến một cái gì đó. 130 00:06:09,390 --> 00:06:12,470 >> Bạn có thể thay đổi một biến có giá trị là 52, 131 00:06:12,470 --> 00:06:14,870 đó là sửa chữa đầu tiên chúng tôi đã có trước đây. 132 00:06:14,870 --> 00:06:17,000 Và bạn có thể tăng mà biến để 53. 133 00:06:17,000 --> 00:06:21,100 Nhưng bạn không thể nói 52 cộng cộng và có mà đột nhiên biến 52 thành 53. 134 00:06:21,100 --> 00:06:23,350 52 luôn luôn là 52. 135 00:06:23,350 --> 00:06:28,860 Và do đó, bạn có thể không vô tình thay đổi kích thước boong ở đây bằng cách điều khiển nó, 136 00:06:28,860 --> 00:06:29,940 137 00:06:29,940 --> 00:06:32,390 >> Một mặt tốt ảnh hưởng của mặc dù đây là 138 00:06:32,390 --> 00:06:38,310 mà bạn có biết rằng không tất cả các nước trên thế giới 139 00:06:38,310 --> 00:06:40,690 sử dụng một cỗ kích thước 52? 140 00:06:40,690 --> 00:06:45,630 Ví dụ, nó thực sự phổ biến trong Đức sử dụng một kích thước boong 32, 141 00:06:45,630 --> 00:06:48,020 nơi họ loại bỏ một số của thẻ giá trị thấp hơn. 142 00:06:48,020 --> 00:06:50,960 Và trong trường hợp này, tôi muốn đến cổng bộ của tôi 143 00:06:50,960 --> 00:06:55,390 các chức năng mà đối phó với thao tác thẻ đến Đức. 144 00:06:55,390 --> 00:06:59,440 Tôi có thể trong trường hợp đầu tiên chúng tôi cho thấy, phải đi và thay thế 145 00:06:59,440 --> 00:07:03,570 tất cả các trường hợp của 52 trong mã của tôi với 32. 146 00:07:03,570 --> 00:07:07,940 >> Nhưng ở đây, nếu tôi # define kích thước boong như 32 ở đầu rất của mã của tôi, 147 00:07:07,940 --> 00:07:11,730 nếu tôi cần phải thay đổi nó, tôi có thể chỉ cần đi và thay đổi điều đó một điều. 148 00:07:11,730 --> 00:07:15,010 Biên dịch lại mã của tôi, và tất cả các Đột nhiên nó truyền qua. 149 00:07:15,010 --> 00:07:18,850 Trong thực tế, chúng ta có thể thay đổi boong kích thước bất kỳ giá trị mà chúng ta muốn. 150 00:07:18,850 --> 00:07:22,500 >> Tôi có thể bạn quan tâm trong một trò chơi của pickup kích thước boong? 151 00:07:22,500 --> 00:07:23,430 >> Tôi Doug Lloyd. 152 00:07:23,430 --> 00:07:25,840 Và đây là CS50. 153 00:07:25,840 --> 00:07:27,772