>> [MUSIC CHƠI]
DOUG LLOYD: Tất cả các quyền.
Loại một chủ đề kỳ lạ, phải không?
Magic số.
Doe những gì ông có nghĩa là khi anh ấy nói về con số ma thuật?
Vâng, một số chương trình mà chúng tôi đã viết trong CS50
đến nay đã có một số lạ số loại ném vào chúng.
Có lẽ vì lý do chúng tôi không hoàn toàn hiểu ngay bây giờ.
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.
Chúng tôi nói rõ ràng rằng bạn không thể đi cao hơn 23.
>> Nhưng những gì hiện 23 nghĩa là gì?
Vâng, nếu bạn đọc spec cẩn thận, bạn
có thể đã thấy rằng Lý do chúng tôi giới hạn nó ở 23
là bởi vì chiều cao tiêu chuẩn của một cửa sổ terminal là 24.
Và như vậy, nếu chúng ta có kim tự tháp là cao hơn,
nó có thể làm điều này lạ nơi nó chạy ra khỏi màn hình.
Và bạn có biết, những gì hiện đó có nghĩa là trong bối cảnh, phải không?
>> 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
và có thể có một khác nhau kích thước cửa sổ terminal?
Chắc là không.
Nó có vẻ như, OK.
Vâng, lý do tại sao nó chỉ ít hơn 23 là?
Nói chung, đó là loại một thói quen xấu thực
để viết các hằng số vào mã của bạn.
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,
nó đôi khi được gọi như sử dụng con số kỳ diệu, đó là cái gì
chúng ta thường muốn cố gắng và tránh.
>> 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.
Rõ ràng là không có dữ liệu loại trong C được gọi là thẻ hoặc boong.
Vì vậy, chỉ cần chịu với tôi.
Đó là một chút giả trộn lẫn ở đây.
Đây là một chức năng gọi là đối phó thẻ mà dường
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.
>> 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,
và tôi đối phó thẻ.
Vâng, chúng tôi đã có một kỳ diệu số ở đây, phải.
Bạn có thấy những gì các con số kỳ diệu là?
Và quan trọng hơn, làm bạn thấy vấn đề là gì đây?
Đặc biệt nếu điều này chỉ là một chức năng
trong tập tin riêng của mình trong một thư mục chứa
một bó khác nhau file, mỗi trong số đó
làm một điều cần một cỗ bài.
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.
>> Bạn có thấy những gì vấn đề có thể có mặt ở đây?
Bạn có thấy những con số kỳ diệu Tôi đã tiêm vào các mã?
Đó là 52, phải.
>> Giống như, trực giác bạn có thể biết, OK.
Giống như một cỗ tiêu chuẩn của thẻ chứa 52 thẻ.
Nhưng trong chương trình của chúng tôi, nó chỉ loại trôi nổi xung quanh trong đó.
Nó giống như tất cả của một đột ngột có một 52.
>> Một cách để giải quyết điều này vấn đề là để làm điều này.
Chúng tôi rất rõ ràng bây giờ gọi ra kích thước boong là 52.
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
sau này thì chúng ta nói, i là ít hơn so với kích thước boong.
Nó chỉ có vẻ tốt hơn vì nói 52.
Bây giờ điều này không thực sự sửa chữa các vấn đề.
Nó đưa ra một số biểu tượng nghĩa là hằng số.
Nhưng nó thực sự loại giới thiệu một vấn đề khác
mà có thể không được ngay lập tức rõ ràng.
Thậm chí nếu biến này được khai báo globally--
ông có nhớ những gì nó có nghĩa là khi chúng ta khai báo
một biến trên toàn cầu so với địa phương?
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ó
một chức năng trong bộ phần mềm của chúng tôi các chức năng
mà đối phó với thao tác thẻ mà vô tình thay đổi kích thước boong,
hoặc nó làm tăng nó bằng 1 hoặc tăng thêm 1.
Điều đó có thể chính tả khó khăn, phải không?
Đặ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
bắt buộc.
Nếu kích thước boong được giảm bằng 1, ví dụ, đến 51,
chúng ta không thực sự xáo trộn tất cả các thẻ có thể.
Chúng tôi đang để lại một trong số họ ra.
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.
>> C cung cấp những gì được gọi là một chỉ thị tiền xử lý, trong đó
cũng được gọi là một vĩ mô cho tạo hằng số tượng trưng.
Và trên thực tế, bạn đã đã nhìn thấy một chỉ thị tiền xử lý,
thậm chí nếu bạn không có nghe nói nó gọi đó bằng #include.
Đó là một ví dụ khác của một vĩ mô hoặc chỉ thị tiền xử lý.
>> 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ố
do đó nó có nhiều hơn có nghĩa, là như sau.
#define, tên, thay thế.
Thực sự quan trọng sang một bên đây thực sự nhanh chóng.
Không đặt một dấu chấm phẩy ở cuối # định nghĩa của bạn.
Vì vậy, nó #define, tên, thay thế.
>> Khi chương trình được biên soạn, những gì thực sự xảy ra
là trình biên dịch nếu đi đi qua mã của bạn
và thay thế mọi chữ "tên" với bất cứ điều gì bạn
đặt thay thế.
Tương tự, nếu #include là loại tương tự để sao chép và dán,
sau đó # xác định là loại tương tự để tìm và thay thế,
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ụ.
>> Vì vậy, ví dụ, nếu tôi # define pi như 3.14159265,
nếu bạn là tốt hơn về mặt toán học nghiêng và bạn đột nhiên
xem 3.14159265 bay xung quanh trong mã của bạn,
bạn có thể biết nó nói về pi.
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.
Và chúng ta có thể thay vì nói #define pi như ngụm số
rằng tôi sẽ không giữ đọc hơn và hơn.
>> 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
biên soạn, điều đầu tiên mà sẽ xảy ra là nó sẽ đi qua
và nó sẽ thay thế tất cả các thời gian nó thấy vốn P, vốn tôi,
nó theo nghĩa đen sẽ thay thế nó với 3,14 và như vậy, do đó bạn
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
có các chức năng mà bạn mong đợi, bởi vì bạn đang làm việc
với thao tác, nhân, phân chia, bất cứ điều gì nó là của pi.
>> Bạn không có giới hạn này thay cho chỉ số.
Ví dụ, tôi có thể # define Tất nhiên như chuỗi CS50.
Trong trường hợp này, khi Chương trình được biên soạn,
#define sẽ đi qua mã, thay thế mỗi khi
nó thấy "tất nhiên" với chuỗi CS50.
>> Bạn sẽ nhận thấy ở đây còn mà tôi thường xuyên
#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,
luôn trong tất cả các mũ.
Đó là một quy ước.
Nó không cần thiết.
Lý do thông thường mọi người sẽ sử dụng tất cả các thủ đô khi họ đang #defining
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
là một hằng số được xác định.
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.
Và có lẽ đó không phải là một điều tốt để làm.
>> Vì vậy, điều này đặc biệt Giải pháp là tốt hơn nhiều
so với cả những người trước đây.
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,
là rất nhiều trực quan hơn và an toàn hơn rất nhiều.
Bạn không thể thao tác một hằng số.
Bạn không thể nói 52 cộng với cộng với.
Đó không phải đi để chuyển đổi nó đến 53.
Bạn không thể thay đổi từ 52 đến một cái gì đó.
>> Bạn có thể thay đổi một biến có giá trị là 52,
đó là sửa chữa đầu tiên chúng tôi đã có trước đây.
Và bạn có thể tăng mà biến để 53.
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.
52 luôn luôn là 52.
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ó,
>> Một mặt tốt ảnh hưởng của mặc dù đây là
mà bạn có biết rằng không tất cả các nước trên thế giới
sử dụng một cỗ kích thước 52?
Ví dụ, nó thực sự phổ biến trong Đức sử dụng một kích thước boong 32,
nơi họ loại bỏ một số của thẻ giá trị thấp hơn.
Và trong trường hợp này, tôi muốn đến cổng bộ của tôi
các chức năng mà đối phó với thao tác thẻ đến Đức.
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ế
tất cả các trường hợp của 52 trong mã của tôi với 32.
>> 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,
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.
Biên dịch lại mã của tôi, và tất cả các Đột nhiên nó truyền qua.
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.
>> Tôi có thể bạn quan tâm trong một trò chơi của pickup kích thước boong?
>> Tôi Doug Lloyd.
Và đây là CS50.