1 00:00:00,000 --> 00:00:02,742 2 00:00:02,742 --> 00:00:05,680 >> SPEAKER 1: Xin chào tất cả mọi người. 3 00:00:05,680 --> 00:00:07,530 Chúng tôi sẽ bắt đầu. 4 00:00:07,530 --> 00:00:09,330 Tôi nghĩ mọi người vẫn còn đang đi được lọc trong. 5 00:00:09,330 --> 00:00:12,840 Nhưng vì lợi ích của thời gian, vì vậy chúng tôi có thể được các bạn ra khỏi đây vào thời gian, 6 00:00:12,840 --> 00:00:14,110 chúng ta sẽ bắt đầu. 7 00:00:14,110 --> 00:00:18,780 Vì vậy, hoan nghênh các CS50 đố 0 xem xét. 8 00:00:18,780 --> 00:00:23,020 Đối với những người bạn của những người đã không nhận ra Chưa hết, bạn có một câu hỏi về thứ tư. 9 00:00:23,020 --> 00:00:25,700 Woo-hoo. 10 00:00:25,700 --> 00:00:29,780 >> Nếu bạn chưa bắt đầu học chưa hay đã không nhận ra rằng điều này tồn tại được nêu ra, 11 00:00:29,780 --> 00:00:34,070 câu đố trong quá khứ và tất cả các thông tin về bài kiểm tra của bạn trên cs50.net/quizzes. 12 00:00:34,070 --> 00:00:38,090 Có một số công cụ khá tốt trên đó, câu đố qua từ cuối 10 13 00:00:38,090 --> 00:00:43,760 năm cũng như thông tin về bài kiểm tra này và các chủ đề 14 00:00:43,760 --> 00:00:46,250 sẽ được bảo hiểm. 15 00:00:46,250 --> 00:00:48,980 Vì vậy, chúng ta hãy bắt đầu. 16 00:00:48,980 --> 00:00:54,240 >> Vì vậy, các bạn có thể nhớ, lần đầu tiên ngày lớp David đã có những đèn trên. 17 00:00:54,240 --> 00:00:59,650 Vì vậy, về cơ bản, tất cả mọi thứ mà đi dưới mui xe của một máy tính là 18 00:00:59,650 --> 00:01:00,860 thực hiện trong hệ nhị phân. 19 00:01:00,860 --> 00:01:04,080 Nhị phân có nghĩa là những gì nó âm thanh như, 0 và 1. 20 00:01:04,080 --> 00:01:09,290 Nó có hai giá trị có thể được đại diện. 21 00:01:09,290 --> 00:01:14,675 >> Vì vậy, giống như trong ngày đầu tiên của phần khi David bật một ánh sáng 22 00:01:14,675 --> 00:01:21,990 bóng đại diện trên, hoặc 1, máy tính của chúng tôi hiểu nhị phân là 0 và 23 00:01:21,990 --> 00:01:24,110 1, trên hoặc tắt. 24 00:01:24,110 --> 00:01:25,360 Khái niệm cơ bản của nhị phân. 25 00:01:25,360 --> 00:01:29,440 26 00:01:29,440 --> 00:01:32,470 Mỗi nơi được đại diện trong cơ sở hai. 27 00:01:32,470 --> 00:01:36,260 Vì vậy, bạn thêm 2 đến 0 đến 1 đến 2 tất cả các con đường lên. 28 00:01:36,260 --> 00:01:41,970 >> Để tính toán những gì nhị phân của bạn là số thập phân, bạn chỉ cần làm theo phương trình này 29 00:01:41,970 --> 00:01:42,840 loại điều. 30 00:01:42,840 --> 00:01:49,510 Nếu bạn có một trong bất kỳ 1 trong những nơi, bạn nhân nó với bất cứ điều gì 31 00:01:49,510 --> 00:01:53,820 căn nó trong, thêm nó lên, và bạn sẽ có được số thập phân. 32 00:01:53,820 --> 00:01:57,930 Vì vậy, đây là cách bạn đếm 5 trong hệ nhị phân. 33 00:01:57,930 --> 00:02:01,400 Cũng giống như những gì chúng tôi đã làm trên trượt cuối cùng, đây là cách bạn sẽ 34 00:02:01,400 --> 00:02:02,650 đại diện cho từ 1 đến 5. 35 00:02:02,650 --> 00:02:05,320 36 00:02:05,320 --> 00:02:09,660 >> Tương tự như vậy, giống như bạn có thể thêm và trừ trong thập phân hoặc căn cứ 10, hoặc 37 00:02:09,660 --> 00:02:13,040 thực sự có cơ sở, có thể thêm vào và trừ trong hệ nhị phân. 38 00:02:13,040 --> 00:02:18,400 Chính xác những gì bạn mong đợi khi bạn thêm hai lên, nó có bằng cao hơn 39 00:02:18,400 --> 00:02:24,220 hơn 1, bạn mang theo 1, làm cho nó một 0, và làm thêm theo cách đó, chỉ 40 00:02:24,220 --> 00:02:29,910 như bạn mong đợi với thường xuyên số thập phân hoặc bất kỳ cơ sở khác. 41 00:02:29,910 --> 00:02:30,970 Mát mẻ. 42 00:02:30,970 --> 00:02:35,140 >> Vì vậy, như tôi đã nói, tất cả mọi thứ đi trên dưới mui xe của máy tính của chúng tôi 43 00:02:35,140 --> 00:02:37,560 được thực hiện trong 0 và 1, hoặc nhị phân. 44 00:02:37,560 --> 00:02:43,470 Vì vậy, làm thế nào để chúng ta bày tỏ, ví dụ, chữ cái, hoặc số, hoặc các ký tự? 45 00:02:43,470 --> 00:02:45,560 Và câu trả lời đó là ASCII. 46 00:02:45,560 --> 00:02:49,380 >> ASCII là một ánh xạ giữa các ký tự mà chúng ta thường thấy trong 47 00:02:49,380 --> 00:02:53,360 Ngôn ngữ tiếng Anh như A, B, C, gạch dưới, dấu gạch ngang, và 48 00:02:53,360 --> 00:02:54,910 bất cứ điều gì như thế. 49 00:02:54,910 --> 00:02:57,260 Và bản đồ đó để giá trị ASCII. 50 00:02:57,260 --> 00:03:03,080 Một giá trị ASCII chỉ là một con số có thể được hiểu bởi máy tính của bạn. 51 00:03:03,080 --> 00:03:07,430 Và cũng giống như bạn có thể làm bổ sung, trừ với các con số, bạn có thể làm 52 00:03:07,430 --> 00:03:10,890 chúng với giá trị ASCII. 53 00:03:10,890 --> 00:03:14,050 >> Vì vậy, trong ví dụ này, những gì này sẽ in ra? 54 00:03:14,050 --> 00:03:26,790 55 00:03:26,790 --> 00:03:35,480 Yeah, vì vậy chỉ cần một không gian không gian không gian C B D. đâu con chuột của tôi đi đâu? 56 00:03:35,480 --> 00:03:39,200 57 00:03:39,200 --> 00:03:43,380 Chú ý bạn có thể xác định một int 65. 58 00:03:43,380 --> 00:03:47,080 Và khi bạn in ra rằng sử dụng phần trăm C, nó sẽ giải thích điều đó như một 59 00:03:47,080 --> 00:03:49,330 nhân vật và sẽ in ra A. 60 00:03:49,330 --> 00:03:52,800 >> Tương tự như vậy, bạn có thể khai báo nó như là một char. 61 00:03:52,800 --> 00:03:56,860 Và khi bạn in nó ra bằng cách sử dụng phần trăm C, nó sẽ giải thích điều đó như 62 00:03:56,860 --> 00:04:05,240 phần trăm D. Và cũng giống như bạn có thể thêm một số lượng, bạn có thể thêm các ký tự có 63 00:04:05,240 --> 00:04:06,878 Giá trị ASCII, trong trường hợp này. 64 00:04:06,878 --> 00:04:11,370 65 00:04:11,370 --> 00:04:16,130 >> Vì vậy, một chút con trỏ cho tất cả mọi người. 66 00:04:16,130 --> 00:04:19,610 5, như là một chuỗi, không thực sự bằng 5. 67 00:04:19,610 --> 00:04:26,610 Vậy làm thế nào chúng ta có thể chuyển đổi chuỗi 5 đến số nguyên 5? 68 00:04:26,610 --> 00:04:28,930 Bất cứ ý tưởng? 69 00:04:28,930 --> 00:04:31,630 Yeah. 70 00:04:31,630 --> 00:04:36,720 >> Vì vậy, nếu chúng tôi có 5 như là một chuỗi, chúng ta có thể trừ đi 0. 71 00:04:36,720 --> 00:04:37,820 Và đó sẽ cho chúng ta 5. 72 00:04:37,820 --> 00:04:41,670 Và tương tự, nếu chúng tôi có 5 như một số nguyên, bổ sung vào chuỗi 0. 73 00:04:41,670 --> 00:04:43,112 Và điều đó cho chúng ta chuỗi 5. 74 00:04:43,112 --> 00:04:46,350 75 00:04:46,350 --> 00:04:48,350 Mát mẻ. 76 00:04:48,350 --> 00:04:52,940 >> Bây giờ, nhớ lại giảng dạy một trong những nơi chúng tôi nói chuyện về các thuật toán. 77 00:04:52,940 --> 00:04:57,260 Vì vậy, làm thế nào để chúng tôi thực sự muốn có một máy tính làm những điều thú vị? 78 00:04:57,260 --> 00:05:00,460 Bạn biết đấy, chỉ cộng và trừ số và in ấn những điều trên không phải là 79 00:05:00,460 --> 00:05:01,730 là thú vị. 80 00:05:01,730 --> 00:05:04,620 Thông thường, chúng ta muốn máy tính của chúng tôi để thực hiện một số loại thuật toán. 81 00:05:04,620 --> 00:05:07,820 Một chút gì đó phức tạp hơn hơn là chỉ số học đơn giản. 82 00:05:07,820 --> 00:05:11,930 >> Một thuật toán chỉ là một từng bước thiết lập các hướng dẫn về cách thực hiện 83 00:05:11,930 --> 00:05:14,640 một task-- nhất định 84 00:05:14,640 --> 00:05:15,660 giống như một công thức. 85 00:05:15,660 --> 00:05:19,990 Bạn có thể nhớ ngày đầu tiên của lớp học, nơi David đã cho chúng tôi đếm một phòng 86 00:05:19,990 --> 00:05:22,550 người và bao nhiêu người là trong phòng. 87 00:05:22,550 --> 00:05:24,480 Bạn có thể được sử dụng để đếm từng người một. 88 00:05:24,480 --> 00:05:25,860 1, 2, 3, 4. 89 00:05:25,860 --> 00:05:28,010 Trong trường hợp đó, một thuật toán thời gian tuyến tính. 90 00:05:28,010 --> 00:05:31,710 >> Nhưng David giới thiệu một thuật toán để bạn đếm số người trong phòng 91 00:05:31,710 --> 00:05:37,340 nơi mà tất cả mọi người đứng lên, bạn nói bạn số cho người khác, thêm vào đó 92 00:05:37,340 --> 00:05:39,200 số, và một người ngồi xuống. 93 00:05:39,200 --> 00:05:40,410 Và bạn lặp lại điều đó. 94 00:05:40,410 --> 00:05:42,910 Đó là một loại thuật toán. 95 00:05:42,910 --> 00:05:47,520 Chúng ta có thể phân tích một cách hiệu quả thuật toán dựa trên nó chạy thời gian. 96 00:05:47,520 --> 00:05:49,680 Nhưng chúng tôi sẽ nói một chút thêm về điều này sau. 97 00:05:49,680 --> 00:05:52,740 98 00:05:52,740 --> 00:05:57,090 >> Vì vậy, tất cả các thuật toán cũng có thể được viết bằng mã giả. 99 00:05:57,090 --> 00:06:01,120 Giả chỉ là một tiếng Anh như cú pháp được sử dụng để đại diện cho 100 00:06:01,120 --> 00:06:02,420 một ngôn ngữ lập trình. 101 00:06:02,420 --> 00:06:06,070 Ví dụ, nếu chúng ta muốn hỏi một người sử dụng đoán số yêu thích của tôi, chúng tôi 102 00:06:06,070 --> 00:06:08,390 có thể có giả như vậy. 103 00:06:08,390 --> 00:06:09,850 >> Có được một người dùng đoán. 104 00:06:09,850 --> 00:06:13,570 Nếu đoán đúng, nói với họ họ là chính xác, nếu không nói cho họ biết 105 00:06:13,570 --> 00:06:15,560 họ không phải là chính xác. 106 00:06:15,560 --> 00:06:22,530 Và giả là một cách dễ dàng đại diện cho một ý tưởng hoặc một thuật toán. 107 00:06:22,530 --> 00:06:26,910 Vì vậy, bây giờ chúng tôi có thể muốn thực sự viết này trong ngôn ngữ mà máy tính 108 00:06:26,910 --> 00:06:27,980 might hiểu biết. 109 00:06:27,980 --> 00:06:35,660 Vì vậy, chúng ta có thể viết mã giả của chúng tôi và giải thích rằng vào mã nguồn. 110 00:06:35,660 --> 00:06:41,320 >> Cho đến nay, mã nguồn phải tuân thủ với một cú pháp nhất định 111 00:06:41,320 --> 00:06:42,490 một ngôn ngữ lập trình. 112 00:06:42,490 --> 00:06:45,430 Và cho đến nay, trong CS50, chúng tôi đã được sử dụng chủ yếu là c. 113 00:06:45,430 --> 00:06:48,320 Vì vậy, đây có thể là mã nguồn cho c. 114 00:06:48,320 --> 00:06:51,440 Sau đó trong khóa học, bạn đi đêm tiếp xúc với lập trình khác 115 00:06:51,440 --> 00:06:52,480 ngôn ngữ như PHP. 116 00:06:52,480 --> 00:06:57,540 Hoặc nếu bạn thậm chí còn có các lớp học khác, bạn có thể làm Java, Python, hoặc thậm chí OCML. 117 00:06:57,540 --> 00:07:01,570 Nhưng trong chương trình ngôn ngữ c của chúng tôi, đây là làm thế nào chúng ta có thể viết mã nguồn cho 118 00:07:01,570 --> 00:07:04,760 các thuật toán mã giả mà Tôi vừa mô tả trước đó. 119 00:07:04,760 --> 00:07:08,630 120 00:07:08,630 --> 00:07:11,430 >> Vì vậy, làm thế nào máy tính của bạn thực sự hiểu không? 121 00:07:11,430 --> 00:07:14,490 Giống như tôi đã nói, nó chỉ thực sự hiểu số không và những người thân. 122 00:07:14,490 --> 00:07:17,880 Vì vậy, làm thế nào để nó nhận được từ các nguồn mã để một cái gì đó có thể được 123 00:07:17,880 --> 00:07:18,960 hiểu? 124 00:07:18,960 --> 00:07:22,920 Vâng, chúng tôi có một cái gì đó được gọi là một trình biên dịch. 125 00:07:22,920 --> 00:07:28,450 >> Nếu bạn nhớ lại trở lại ở hầu hết các bạn psets, bạn đã có một số loại chương trình 126 00:07:28,450 --> 00:07:30,370 bằng văn bản trong một tập tin chấm c. 127 00:07:30,370 --> 00:07:32,550 Và sau đó bạn sẽ gõ thực hiện. 128 00:07:32,550 --> 00:07:35,970 Vì vậy, những gì đang làm làm gì? 129 00:07:35,970 --> 00:07:39,970 >> Bạn có thể gõ make để biên dịch của bạn chương trình vì someone-- 130 00:07:39,970 --> 00:07:42,730 ai đã viết p thiết lập của bạn; có lẽ David-- 131 00:07:42,730 --> 00:07:44,190 tạo ra một tập tin thực hiện. 132 00:07:44,190 --> 00:07:51,320 Và điều đó làm cho biết để chạy của bạn trình biên dịch, được gọi là kêu vang, mà sẽ 133 00:07:51,320 --> 00:07:55,560 sau đó biên dịch mã nguồn của bạn để phản đối mã, đó là số không và những người thân 134 00:07:55,560 --> 00:07:57,720 máy tính của bạn hiểu được. 135 00:07:57,720 --> 00:08:01,610 Nhưng một lát sau, chúng ta sẽ đi sâu hơn về trình biên dịch. 136 00:08:01,610 --> 00:08:05,640 137 00:08:05,640 --> 00:08:10,800 >> Vì vậy, nhớ lại pset 0, where-- có, bạn có câu hỏi? 138 00:08:10,800 --> 00:08:11,620 >> TƯỢNG: [không nghe được]? 139 00:08:11,620 --> 00:08:12,490 >> SPEAKER 1: Có. 140 00:08:12,490 --> 00:08:14,960 Tôi nghĩ rằng họ thực sự nên được trực tuyến. 141 00:08:14,960 --> 00:08:15,120 Yeah. 142 00:08:15,120 --> 00:08:16,572 >> TƯỢNG: Có như [không nghe được]? 143 00:08:16,572 --> 00:08:19,476 144 00:08:19,476 --> 00:08:20,830 >> SPEAKER 1: Nó không phải là. 145 00:08:20,830 --> 00:08:25,810 Các doanh nghiệp tính cs50.net/quizzes. 146 00:08:25,810 --> 00:08:32,900 >> TƯỢNG: câu đố Slash, giảm năm 2013, giảm 0, và chỉ cần nhấp vào thông qua 147 00:08:32,900 --> 00:08:35,956 câu đố 2013 và bài kiểm tra 0, xem lại phần trình bày. 148 00:08:35,956 --> 00:08:40,380 >> SPEAKER 1: Vâng, vì vậy nếu các bạn muốn kéo nó lên và nhìn vào nó, bạn sẽ 149 00:08:40,380 --> 00:08:42,740 máy tính riêng, đó là tốt quá. 150 00:08:42,740 --> 00:08:43,130 Nói rằng một lần nữa. 151 00:08:43,130 --> 00:08:44,546 >> TƯỢNG: [không nghe được]. 152 00:08:44,546 --> 00:08:48,780 >> SPEAKER 1: Yeah, [không nghe được] là biến giả. 153 00:08:48,780 --> 00:08:49,644 Ồ, có chứ? 154 00:08:49,644 --> 00:08:51,372 >> TƯỢNG: [không nghe được]? 155 00:08:51,372 --> 00:08:54,300 >> SPEAKER 1: Không, cuộc đình công không vào kỳ thi. 156 00:08:54,300 --> 00:08:55,950 Xin lỗi, câu hỏi của cô, là đình công vào kỳ thi. 157 00:08:55,950 --> 00:08:59,530 Và nó không phải là. 158 00:08:59,530 --> 00:09:05,780 Vì vậy, pset 0, các bạn nên có tất cả thực hiện một cái gì đó sử dụng đầu. 159 00:09:05,780 --> 00:09:13,100 Và chúng tôi đã học được một số chương trình cơ bản khối xây dựng bằng cách sử dụng đầu. 160 00:09:13,100 --> 00:09:15,590 >> Vì vậy, chúng ta hãy xem xét một số các khối xây dựng 161 00:09:15,590 --> 00:09:18,170 tạo nên một chương trình. 162 00:09:18,170 --> 00:09:20,570 Đầu tiên là biểu thức Boolean. 163 00:09:20,570 --> 00:09:24,540 Biểu thức Boolean là những người thân và 0 hay bất cứ điều gì có 164 00:09:24,540 --> 00:09:25,700 hai giá trị có thể. 165 00:09:25,700 --> 00:09:30,320 Trong trường hợp này, đúng hay sai, hoặc tắt, và có hoặc không. 166 00:09:30,320 --> 00:09:35,390 Một ví dụ đơn giản, rất đơn giản, chương trình sử dụng một Boolean 167 00:09:35,390 --> 00:09:39,140 biểu hiện ở đây. 168 00:09:39,140 --> 00:09:43,220 >> Vì vậy, để cho các biểu thức Boolean để có ích, chúng tôi có các toán tử logic. 169 00:09:43,220 --> 00:09:48,920 Đây là những nhà khai thác có thể được sử dụng để so sánh giá trị nhất định. 170 00:09:48,920 --> 00:09:52,820 Vì vậy, chúng ta có hay không và bằng ít hơn, hơn hoặc bằng, lớn hơn hoặc 171 00:09:52,820 --> 00:09:55,130 bằng, và ít hơn hoặc lớn hơn. 172 00:09:55,130 --> 00:09:59,060 Tuy nhiên, các nhà khai thác không phải là rất hữu ích trừ khi chúng ta có thể kết hợp chúng thành 173 00:09:59,060 --> 00:10:00,320 điều kiện. 174 00:10:00,320 --> 00:10:04,370 >> Vì vậy, các bạn có thể nhớ từ đầu và từ p của bạn đặt ra là chúng ta 175 00:10:04,370 --> 00:10:05,400 có điều kiện. 176 00:10:05,400 --> 00:10:09,710 Họ là, về cơ bản, giống như dĩa trong logic của chương trình của bạn 177 00:10:09,710 --> 00:10:12,670 thực hiện tùy thuộc vào việc một điều kiện được đáp ứng. 178 00:10:12,670 --> 00:10:18,150 Vì vậy, một trong những điều kiện mà chúng tôi đã sử dụng nhiều lần trong khóa học này là 179 00:10:18,150 --> 00:10:21,470 nếu, nếu không, nếu, và các điều kiện khác. 180 00:10:21,470 --> 00:10:24,060 >> Dưới đây là một ví dụ về cách bạn có thể sử dụng. 181 00:10:24,060 --> 00:10:28,430 Có ai biết sự khác biệt giữa chỉ sử dụng nếu báo cáo tất cả 182 00:10:28,430 --> 00:10:32,530 các con đường xuống câu nếu, khác, nếu, và khác kết hợp? 183 00:10:32,530 --> 00:10:33,013 Có? 184 00:10:33,013 --> 00:10:34,263 >> TƯỢNG: [không nghe được]. 185 00:10:34,263 --> 00:10:40,741 186 00:10:40,741 --> 00:10:42,160 >> SPEAKER 1: Chính xác. 187 00:10:42,160 --> 00:10:50,210 Vì vậy, nếu tôi đã có nếu tất cả các con đường xuống này cách, ngay cả khi tình trạng này trở lại 188 00:10:50,210 --> 00:10:52,800 đúng, nó vẫn sẽ tiếp tục kiểm tra hai tới. 189 00:10:52,800 --> 00:11:00,120 Trong khi đó, với một người nào khác, nếu một người nào khác tuyên bố, nếu một trong những trả về true, 190 00:11:00,120 --> 00:11:02,640 những người khác không được kiểm tra. 191 00:11:02,640 --> 00:11:05,955 Mọi thắc mắc về điều đó? 192 00:11:05,955 --> 00:11:06,890 Mát mẻ. 193 00:11:06,890 --> 00:11:12,240 >> Vì vậy, bạn sử dụng một nếu-khác của một người nào khác tuyên bố nếu bạn biết rằng nó có thể chỉ 194 00:11:12,240 --> 00:11:14,470 là một trong những trường hợp này. 195 00:11:14,470 --> 00:11:21,550 Vì vậy, chúng ta biết nếu x là nhỏ hơn 0, nó chắc chắn sẽ không được 196 00:11:21,550 --> 00:11:22,890 lớn hơn 0. 197 00:11:22,890 --> 00:11:26,940 198 00:11:26,940 --> 00:11:31,480 >> Tiếp theo, một khối xây dựng mà chúng tôi được biết là các vòng lặp. 199 00:11:31,480 --> 00:11:33,310 Chúng tôi có ba loại vòng. 200 00:11:33,310 --> 00:11:35,830 Đối với các vòng lặp, trong khi vòng, và làm trong khi vòng. 201 00:11:35,830 --> 00:11:38,730 Và nói chung, khi bạn ngồi xuống để viết một cái gì đó, bạn phải quyết định 202 00:11:38,730 --> 00:11:40,060 mà trong ba bạn muốn sử dụng. 203 00:11:40,060 --> 00:11:41,900 Vì vậy, làm thế nào để chúng tôi quyết định cái nào? 204 00:11:41,900 --> 00:11:44,920 205 00:11:44,920 --> 00:11:48,790 >> Chúng tôi thường sử dụng một vòng lặp nếu chúng ta biết bao nhiêu lần chúng tôi muốn lặp 206 00:11:48,790 --> 00:11:53,650 thông qua một cái gì đó hoặc bao nhiêu lần chúng tôi muốn thực hiện một nhiệm vụ. 207 00:11:53,650 --> 00:11:58,830 Chúng tôi sử dụng trong khi các vòng nếu chúng ta cần một số điều kiện là đúng sự thật để tiếp tục chạy. 208 00:11:58,830 --> 00:12:03,730 Và chúng tôi sử dụng làm trong khi rất giống với thời gian, nhưng chúng tôi muốn mã của chúng tôi để chạy ở 209 00:12:03,730 --> 00:12:04,880 ít nhất một lần. 210 00:12:04,880 --> 00:12:09,410 >> Vì vậy, thời gian, bất cứ điều gì trong làm sẽ luôn luôn chạy ít nhất một lần. 211 00:12:09,410 --> 00:12:13,120 Trong khi đó, với thời gian, nó không thể chạy tất cả nếu 212 00:12:13,120 --> 00:12:15,490 điều kiện là không hài lòng. 213 00:12:15,490 --> 00:12:16,740 Bất kỳ câu hỏi với điều đó? 214 00:12:16,740 --> 00:12:20,480 215 00:12:20,480 --> 00:12:22,860 >> Vì vậy, cấu trúc của một vòng lặp. 216 00:12:22,860 --> 00:12:23,620 Các bạn đều đã nhìn thấy điều này. 217 00:12:23,620 --> 00:12:25,320 Bạn khởi tạo nó. 218 00:12:25,320 --> 00:12:26,600 Bạn có một số loại điều kiện. 219 00:12:26,600 --> 00:12:32,340 Vì vậy, ví dụ, chúng ta có thể khởi tạo như đối với tôi bằng 0. 220 00:12:32,340 --> 00:12:34,040 i nhỏ hơn 10. 221 00:12:34,040 --> 00:12:35,442 Và tôi ++. 222 00:12:35,442 --> 00:12:39,010 Một trong rất đơn giản mà chúng tôi đã thực hiện. 223 00:12:39,010 --> 00:12:42,210 >> Đối với một vòng lặp trong khi, tương tự, bạn có có một số loại khởi tạo, 224 00:12:42,210 --> 00:12:44,980 một số loại điều kiện, và một số loại cập nhật. 225 00:12:44,980 --> 00:12:51,990 Vì vậy, chúng ta có thể thực hiện của chúng tôi cho vòng lặp cũng như một vòng lặp trong khi sử dụng này. 226 00:12:51,990 --> 00:12:56,000 Và tương tự với việc phải làm trong khi vòng lặp, chúng ta có thể có một số khởi tạo, 227 00:12:56,000 --> 00:12:58,640 thực hiện một cái gì đó, cập nhật nó, và sau đó kiểm tra điều kiện. 228 00:12:58,640 --> 00:13:03,500 229 00:13:03,500 --> 00:13:05,140 >> Vì vậy, bây giờ các chức năng. 230 00:13:05,140 --> 00:13:06,460 Chúng tôi đặt tất cả mọi thứ lại với nhau. 231 00:13:06,460 --> 00:13:10,140 Chúng tôi có thể muốn viết một số loại chức năng. 232 00:13:10,140 --> 00:13:12,790 Chức năng phổ biến mà có lẽ bạn đã thấy đã là chính. 233 00:13:12,790 --> 00:13:13,770 Chính là một chức năng. 234 00:13:13,770 --> 00:13:16,160 Nó có một kiểu trả về int. 235 00:13:16,160 --> 00:13:18,470 Nó có một cái tên chức năng, chính. 236 00:13:18,470 --> 00:13:20,810 Và nó có lý lẽ, argc và argv. 237 00:13:20,810 --> 00:13:24,040 Vì vậy, chính là chỉ là một chức năng. 238 00:13:24,040 --> 00:13:27,230 >> Các chức năng khác bạn có thể đã được sử dụng, printf printf-- là một function-- 239 00:13:27,230 --> 00:13:29,330 GetInt, toupper. 240 00:13:29,330 --> 00:13:32,010 Nhưng những xảy ra để có được thực hiện đối với chúng tôi bởi 241 00:13:32,010 --> 00:13:33,270 một số loại thư viện. 242 00:13:33,270 --> 00:13:37,400 Nếu các bạn nhớ bao gồm thư viện này CS50.h hoặc 243 00:13:37,400 --> 00:13:38,510 tiêu chuẩn I / O thư viện. 244 00:13:38,510 --> 00:13:39,200 Vâng, câu hỏi? 245 00:13:39,200 --> 00:13:41,610 >> TƯỢNG: Liệu chính chỉ vốn có trong c? 246 00:13:41,610 --> 00:13:44,740 Liệu nó chỉ là loại [không nghe được]? 247 00:13:44,740 --> 00:13:47,370 >> SPEAKER 1: Câu hỏi đặt ra là nếu chính là vốn có trong c. 248 00:13:47,370 --> 00:13:51,460 Và có, tất cả các chức năng có chức năng chính. 249 00:13:51,460 --> 00:13:55,290 Đó là loại cần thiết cho máy tính biết bắt đầu từ đâu 250 00:13:55,290 --> 00:13:55,993 chạy mã. 251 00:13:55,993 --> 00:13:58,108 >> TƯỢNG: Vì vậy, bạn sẽ không [không nghe được]? 252 00:13:58,108 --> 00:13:59,480 >> SPEAKER 1: số 253 00:13:59,480 --> 00:14:00,760 Bất kỳ câu hỏi nào khác không? 254 00:14:00,760 --> 00:14:03,430 255 00:14:03,430 --> 00:14:04,770 Mát mẻ. 256 00:14:04,770 --> 00:14:08,050 Vì vậy, cũng giống như bạn có thể sử dụng một chức năng đó là được viết cho bạn, bạn cũng có thể 257 00:14:08,050 --> 00:14:10,380 viết chức năng của riêng bạn. 258 00:14:10,380 --> 00:14:17,050 Đây là một chức năng mà ai đó có thể đã viết để tính toán khối lượng 259 00:14:17,050 --> 00:14:18,395 của một q, ví dụ. 260 00:14:18,395 --> 00:14:21,300 261 00:14:21,300 --> 00:14:29,500 Có một loại trở lại đây, trong trường hợp này int, chúng tôi q tên chức năng và của chúng tôi 262 00:14:29,500 --> 00:14:31,360 danh sách các tham số. 263 00:14:31,360 --> 00:14:34,550 >> Và lưu ý rằng bạn phải viết dữ liệu kiểu của tham số bạn muốn 264 00:14:34,550 --> 00:14:38,660 sử dụng hoặc chức năng khác không biết những loại 265 00:14:38,660 --> 00:14:41,650 thông số tôi nên được chấp nhận. 266 00:14:41,650 --> 00:14:48,110 Vì vậy, trong trường hợp này, chúng tôi muốn một số nguyên như là đầu vào của chúng tôi. 267 00:14:48,110 --> 00:14:50,390 Vì vậy, tại sao chúng ta có thể muốn sử dụng chức năng? 268 00:14:50,390 --> 00:14:52,800 >> Trước hết, tuyệt vời cho tổ chức. 269 00:14:52,800 --> 00:14:56,350 Chúng giúp phá vỡ mã của bạn vào nhiều tổ chức và làm cho khối 270 00:14:56,350 --> 00:14:57,960 nó dễ dàng hơn để đọc. 271 00:14:57,960 --> 00:14:59,760 Đơn giản hóa. 272 00:14:59,760 --> 00:15:01,740 Điều này là tốt cho thiết kế. 273 00:15:01,740 --> 00:15:04,570 Khi bạn đang đọc một đoạn mã và các chức năng chính là thực sự, 274 00:15:04,570 --> 00:15:07,750 thực sự lâu dài, nó có thể là khó khăn hơn để Lý do về những gì đang xảy ra. 275 00:15:07,750 --> 00:15:11,710 Vì vậy, nếu bạn chia nó ra thành các chức năng, nó có thể được dễ dàng hơn để đọc. 276 00:15:11,710 --> 00:15:12,750 Và tái sử dụng, khả năng. 277 00:15:12,750 --> 00:15:16,940 Nếu bạn có một đoạn code đó là được gọi hoặc chạy nhiều lần, 278 00:15:16,940 --> 00:15:20,690 thay vì viết lại mã 10 lần chức năng chính của bạn, có lẽ bạn 279 00:15:20,690 --> 00:15:21,440 muốn tái sử dụng nó. 280 00:15:21,440 --> 00:15:25,740 Và sau đó mỗi khi bạn cần phải sử dụng đoạn mã, gọi hàm. 281 00:15:25,740 --> 00:15:30,550 282 00:15:30,550 --> 00:15:35,380 >> Vì vậy, bây giờ nếu chúng ta nhớ lại đầu, chúng tôi cũng nói về một vài khái niệm, 283 00:15:35,380 --> 00:15:37,680 một trong số đó là luồng. 284 00:15:37,680 --> 00:15:41,120 Chủ đề là khái niệm của nhiều chuỗi mã 285 00:15:41,120 --> 00:15:43,040 thực hiện cùng một lúc. 286 00:15:43,040 --> 00:15:47,490 Vì vậy, nghĩ lại ngày một trong những nơi David đã các bạn cách đếm số lượng 287 00:15:47,490 --> 00:15:48,440 mọi người trong phòng. 288 00:15:48,440 --> 00:15:50,550 >> Về cơ bản, những gì đang diễn ra trên là tất cả các bạn đã 289 00:15:50,550 --> 00:15:52,370 chạy chủ đề riêng biệt. 290 00:15:52,370 --> 00:15:55,540 Và những chủ đề đã được đến với nhau để có được một số loại câu trả lời. 291 00:15:55,540 --> 00:15:58,890 Tương tự, tại Scratch, khi bạn có nhiều họa tiết, có lẽ bạn 292 00:15:58,890 --> 00:16:01,070 có một con mèo và một con chó. 293 00:16:01,070 --> 00:16:08,770 Và họ sẽ cùng một lúc chạy các kịch bản của mình. 294 00:16:08,770 --> 00:16:10,020 Đó là một ví dụ về luồng. 295 00:16:10,020 --> 00:16:12,860 296 00:16:12,860 --> 00:16:18,000 >> Và khái niệm khác đó là giới thiệu trong đầu là sự kiện. 297 00:16:18,000 --> 00:16:22,550 Và sự kiện là khi nhiều bộ phận của mã của bạn giao tiếp với nhau. 298 00:16:22,550 --> 00:16:26,840 Trong Scratch, đây là khi bạn sử dụng kiểm soát và phát sóng Khi tôi 299 00:16:26,840 --> 00:16:29,500 Nhận khối. 300 00:16:29,500 --> 00:16:35,170 >> Và cũng có thể, trong vấn đề Set 4, chúng ta đã thấy một chút của sự kiện là tốt. 301 00:16:35,170 --> 00:16:38,250 Các bạn có thể đã sử dụng thư viện Gevent. 302 00:16:38,250 --> 00:16:42,450 Và có một chức năng waitForClick mà bạn đã chờ đợi 303 00:16:42,450 --> 00:16:44,300 cho người sử dụng nhấn chuột. 304 00:16:44,300 --> 00:16:47,870 Và nhấp chuột của bạn, trong trường hợp này, sẽ là các sự kiện và chờ đợi cú nhấp chuột là bạn 305 00:16:47,870 --> 00:16:49,120 xử lý sự kiện. 306 00:16:49,120 --> 00:16:53,690 307 00:16:53,690 --> 00:16:58,630 >> Và cũng có thể, trong suốt chạy psets của bạn và làm việc trên psets của bạn, bạn 308 00:16:58,630 --> 00:17:01,920 có thể đã tiếp xúc với một số các lệnh này. 309 00:17:01,920 --> 00:17:05,579 Đây là những gì bạn đã gõ vào của bạn cửa sổ thiết bị đầu cuối hoặc bất cứ cửa sổ 310 00:17:05,579 --> 00:17:12,119 mà xuất hiện trên g của bạn để chỉnh sửa, về cơ bản, điều hướng máy tính của bạn. 311 00:17:12,119 --> 00:17:19,440 >> Vì vậy, ví dụ, danh sách các LS nội dung của một thư mục. 312 00:17:19,440 --> 00:17:22,510 Tạo một thư mục tạo ra một thư mục mới. 313 00:17:22,510 --> 00:17:24,819 CD, thay đổi thư mục. 314 00:17:24,819 --> 00:17:28,400 RM, loại bỏ, xóa một tập tin hoặc một số thư mục. 315 00:17:28,400 --> 00:17:31,050 Và sau đó loại bỏ các thư mục loại bỏ một thư mục. 316 00:17:31,050 --> 00:17:32,300 >> TƯỢNG: [không nghe được]? 317 00:17:32,300 --> 00:17:36,978 318 00:17:36,978 --> 00:17:38,370 >> SPEAKER 1: Vâng, chắc chắn. 319 00:17:38,370 --> 00:17:42,530 320 00:17:42,530 --> 00:17:46,040 Xin lỗi, câu hỏi là nếu bạn sẽ đề nghị đặt này 321 00:17:46,040 --> 00:17:48,840 trên bảng cheat. 322 00:17:48,840 --> 00:17:49,440 Nó có thể giúp đỡ. 323 00:17:49,440 --> 00:17:51,490 Nếu bạn có phòng, bạn có thể đặt nó trên. 324 00:17:51,490 --> 00:17:56,170 Nó cũng chỉ nói chung đủ tốt nhớ bởi vì khi bạn sử dụng nó 325 00:17:56,170 --> 00:17:59,060 bạn có thể muốn chỉ có nó nhớ. 326 00:17:59,060 --> 00:18:02,750 Điều đó sẽ làm cho cuộc sống của bạn dễ dàng hơn rất nhiều. 327 00:18:02,750 --> 00:18:04,000 Tôi đã trả lời câu hỏi của bạn? 328 00:18:04,000 --> 00:18:10,528 329 00:18:10,528 --> 00:18:14,290 >> Vì vậy, bây giờ, chúng tôi nói chuyện một chút ngắn gọn về thư viện. 330 00:18:14,290 --> 00:18:18,570 Tuy nhiên, hai người chính mà chúng ta đã sử dụng cho đến nay trong khóa học là 331 00:18:18,570 --> 00:18:20,860 tiêu chuẩn I / O và CS50. 332 00:18:20,860 --> 00:18:25,410 Những loại những thứ được bao gồm trong tôi tiêu chuẩn / thư viện O? 333 00:18:25,410 --> 00:18:28,410 >> Vâng, cho đến nay chúng tôi đã sử dụng printf. 334 00:18:28,410 --> 00:18:31,150 Trong CS50, chúng tôi đã sử dụng getInt và GetString. 335 00:18:31,150 --> 00:18:37,200 Và chuỗi kiểu dữ liệu cũng sẽ xảy ra được khai báo trong thư viện CS50 này. 336 00:18:37,200 --> 00:18:40,250 Chúng ta sẽ nói nhiều hơn một chút sâu về thư viện làm việc như thế nào và làm thế nào họ 337 00:18:40,250 --> 00:18:41,870 tương tác với phần còn lại của mã của bạn. 338 00:18:41,870 --> 00:18:46,220 Tuy nhiên, những người là hai cái chính là chúng ta đã tiếp xúc với cho đến nay trong 339 00:18:46,220 --> 00:18:48,430 quá trình. 340 00:18:48,430 --> 00:18:50,050 >> Các loại. 341 00:18:50,050 --> 00:18:58,120 Đây là tốt để nhớ bao nhiêu từng loại được đại diện bởi hoặc làm thế nào 342 00:18:58,120 --> 00:19:02,840 nhiều byte mỗi loại requires-- 343 00:19:02,840 --> 00:19:04,990 int, 4 byte; char, 1 byte. 344 00:19:04,990 --> 00:19:06,550 Float là 4 byte. 345 00:19:06,550 --> 00:19:07,782 Thế nào là một đôi? 346 00:19:07,782 --> 00:19:09,032 >> TƯỢNG: [không nghe được]. 347 00:19:09,032 --> 00:19:11,398 348 00:19:11,398 --> 00:19:16,240 >> SPEAKER 1: Vâng, vì vậy một phao nhưng tăng gấp đôi kích thước. 349 00:19:16,240 --> 00:19:17,150 Những gì về một thời gian dài? 350 00:19:17,150 --> 00:19:18,400 >> TƯỢNG: [không nghe được]. 351 00:19:18,400 --> 00:19:21,614 352 00:19:21,614 --> 00:19:24,680 >> SPEAKER 1: OK. 353 00:19:24,680 --> 00:19:25,410 Là những gì một thời gian dài? 354 00:19:25,410 --> 00:19:26,660 >> TƯỢNG: [không nghe được]. 355 00:19:26,660 --> 00:19:29,400 356 00:19:29,400 --> 00:19:31,450 >> SPEAKER 1: Yeah, tăng gấp đôi một int. 357 00:19:31,450 --> 00:19:34,240 358 00:19:34,240 --> 00:19:34,705 Có. 359 00:19:34,705 --> 00:19:36,100 >> TƯỢNG: [không nghe được]. 360 00:19:36,100 --> 00:19:38,030 >> SPEAKER 1: Long [không nghe được]. 361 00:19:38,030 --> 00:19:41,860 Và sau đó một thời gian dài dài là gấp đôi. 362 00:19:41,860 --> 00:19:42,814 >> TƯỢNG: Không, không. 363 00:19:42,814 --> 00:19:47,107 Một dài chỉ là một int. 364 00:19:47,107 --> 00:19:50,910 Nó phụ thuộc vào kiến ​​trúc trước khi [không nghe được] 365 00:19:50,910 --> 00:19:52,922 và int có cùng kích thước. 366 00:19:52,922 --> 00:19:54,172 [Không nghe được]. 367 00:19:54,172 --> 00:19:58,841 368 00:19:58,841 --> 00:20:00,920 >> SPEAKER 1: Vì vậy, một thời gian dài và một int đều giống nhau. 369 00:20:00,920 --> 00:20:02,943 Và sau đó một thời gian dài dài là gấp đôi int. 370 00:20:02,943 --> 00:20:03,910 Mát mẻ. 371 00:20:03,910 --> 00:20:05,550 Và sau đó, loại cuối cùng là gì? 372 00:20:05,550 --> 00:20:06,510 >> TƯỢNG: Pointer. 373 00:20:06,510 --> 00:20:10,350 >> SPEAKER 1: Vâng, vì vậy chúng tôi đã học được một chút về con trỏ. 374 00:20:10,350 --> 00:20:14,015 Và bất kể những gì một con trỏ chỉ đối với: nó có thể là một ngôi sao char 375 00:20:14,015 --> 00:20:15,880 hoặc một int star-- 376 00:20:15,880 --> 00:20:20,530 nó luôn luôn là 4 byte cho một con trỏ. 377 00:20:20,530 --> 00:20:21,633 Các câu hỏi về điều đó? 378 00:20:21,633 --> 00:20:22,116 Có? 379 00:20:22,116 --> 00:20:24,531 >> TƯỢNG: [không nghe được]? 380 00:20:24,531 --> 00:20:29,530 >> SPEAKER 1: Vì vậy, một thời gian dài và là một int giống nhau trong thiết bị CS50 này. 381 00:20:29,530 --> 00:20:32,302 >> TƯỢNG: Thiết bị là hoàn toàn hoán đổi cho nhau. 382 00:20:32,302 --> 00:20:33,510 >> SPEAKER 1: Vâng. 383 00:20:33,510 --> 00:20:36,610 Vì vậy, sau đó một thời gian dài dài gấp đôi một int. 384 00:20:36,610 --> 00:20:39,250 >> TƯỢNG: Đây là 32 bit? 385 00:20:39,250 --> 00:20:40,620 >> SPEAKER 1: 32 bit, yeah. 386 00:20:40,620 --> 00:20:43,572 >> TƯỢNG: Vì vậy, [không nghe được]? 387 00:20:43,572 --> 00:20:46,790 >> SPEAKER 1: Vâng, nếu nó không một cách rõ ràng nói, bạn 388 00:20:46,790 --> 00:20:47,870 nên cho một chút 32. 389 00:20:47,870 --> 00:20:50,040 >> TƯỢNG: Nó sẽ nói điều gì đó như giả định một 390 00:20:50,040 --> 00:20:51,498 kiến trúc như thiết bị. 391 00:20:51,498 --> 00:20:58,800 392 00:20:58,800 --> 00:21:01,710 Đối với 64 bit, điều duy nhất mà thay đổi đang chờ đợi và con trỏ. 393 00:21:01,710 --> 00:21:05,614 Cả hai đều [không nghe được]. 394 00:21:05,614 --> 00:21:06,590 >> SPEAKER 1: Có? 395 00:21:06,590 --> 00:21:07,566 >> TƯỢNG: Câu hỏi. 396 00:21:07,566 --> 00:21:10,982 Vì vậy, trên một trong những câu đố thực tế, nó sẽ hỏi về một int unsigned. 397 00:21:10,982 --> 00:21:15,374 Vậy làm thế nào mà sẽ được xác định từ một int [không nghe được]? 398 00:21:15,374 --> 00:21:18,140 >> SPEAKER 1: unsigned trong cũng là 4 byte. 399 00:21:18,140 --> 00:21:21,172 Nhưng những gì là khác nhau về một ký int và unsigned int? 400 00:21:21,172 --> 00:21:22,422 >> TƯỢNG: [không nghe được]. 401 00:21:22,422 --> 00:21:24,868 402 00:21:24,868 --> 00:21:25,630 >> SPEAKER 1: Đúng vậy. 403 00:21:25,630 --> 00:21:27,570 Người ta có thể đại diện cho các giá trị âm. 404 00:21:27,570 --> 00:21:28,580 Nhưng làm thế nào nó làm điều đó? 405 00:21:28,580 --> 00:21:30,536 >> TƯỢNG: [không nghe được]. 406 00:21:30,536 --> 00:21:36,370 >> SPEAKER 1: Yeah, nó giúp tiết kiệm 1 bit để đại diện cho dấu hiệu. 407 00:21:36,370 --> 00:21:40,910 408 00:21:40,910 --> 00:21:45,040 Đã ký có một chút mà đại diện cho dấu hiệu. 409 00:21:45,040 --> 00:21:48,886 Và unsigned chỉ là tất cả tích cực. 410 00:21:48,886 --> 00:21:50,365 >> TƯỢNG: OK. 411 00:21:50,365 --> 00:21:54,230 Vì vậy, bạn nói rằng một đôi là hai lần kích thước của một phao? 412 00:21:54,230 --> 00:21:58,202 >> SPEAKER 1: đôi là hai lần kích thước của một phao, có. 413 00:21:58,202 --> 00:22:01,639 >> TƯỢNG: Làm thế nào một con trỏ để một lâu dài [không nghe được]? 414 00:22:01,639 --> 00:22:06,058 415 00:22:06,058 --> 00:22:10,870 >> SPEAKER 1: Vì vậy, câu hỏi là làm thế nào con trỏ đến một long-- dài 416 00:22:10,870 --> 00:22:13,800 làm thế nào là chỉ có bốn byte khi một lâu dài 8 byte của nó. 417 00:22:13,800 --> 00:22:17,310 Vì vậy, hãy nhớ một con trỏ là gì, về cơ bản, theo giá trị rất cơ bản. 418 00:22:17,310 --> 00:22:19,046 >> TƯỢNG: [không nghe được]. 419 00:22:19,046 --> 00:22:22,670 >> SPEAKER 1: Yeah, do đó, một con trỏ chỉ là một vị trí bộ nhớ. 420 00:22:22,670 --> 00:22:28,040 Vì vậy, nó không quan trọng bao nhiêu không gian con trỏ trỏ tới. 421 00:22:28,040 --> 00:22:32,060 Nó chỉ cần 4 byte để theo dõi trong đó vị trí bộ nhớ. 422 00:22:32,060 --> 00:22:34,760 423 00:22:34,760 --> 00:22:36,010 Bất kỳ câu hỏi nào khác không? 424 00:22:36,010 --> 00:22:39,800 425 00:22:39,800 --> 00:22:41,050 Mát mẻ. 426 00:22:41,050 --> 00:22:42,920 427 00:22:42,920 --> 00:22:47,460 >> Vì vậy, điều cuối cùng tôi có là đầu ra tiêu chuẩn. 428 00:22:47,460 --> 00:22:51,020 Bạn nên sử dụng chúng thường xuyên đủ để bạn có thể nhớ. 429 00:22:51,020 --> 00:22:54,800 Nhưng điều này là khi chúng ta sử dụng printf, ví dụ. 430 00:22:54,800 --> 00:22:59,260 Và chúng tôi có những giữ chỗ đó được gọi là mã định dạng. 431 00:22:59,260 --> 00:23:03,910 >> Vì vậy, phần trăm c char, phần trăm cho tôi int, và chúng tôi cũng có thể sử dụng phần trăm d. 432 00:23:03,910 --> 00:23:05,130 Đó là điều tương tự. 433 00:23:05,130 --> 00:23:08,200 Nhưng, nói chung, trong CS50 chúng tôi cố gắng sử dụng phần trăm tôi. 434 00:23:08,200 --> 00:23:09,860 Phần trăm f cho phao. 435 00:23:09,860 --> 00:23:15,620 Phần trăm ld lâu dài và phần trăm của các chuỗi. 436 00:23:15,620 --> 00:23:18,550 >> Tương tự như vậy, chúng tôi đã sử dụng một vài các trình tự thoát ra. 437 00:23:18,550 --> 00:23:22,431 Ví dụ, dấu gạch chéo ngược n cho dòng mới. 438 00:23:22,431 --> 00:23:26,910 Đây chỉ là khi bạn đang định dạng mã của bạn để in f. 439 00:23:26,910 --> 00:23:27,260 Có? 440 00:23:27,260 --> 00:23:28,906 >> TƯỢNG: phần trăm d là gì? 441 00:23:28,906 --> 00:23:31,850 >> SPEAKER 1: Vậy câu hỏi là phần trăm d là để làm gì? 442 00:23:31,850 --> 00:23:33,270 Phần trăm d là cho ints. 443 00:23:33,270 --> 00:23:37,392 Phần trăm d và phần trăm tôi đều giống nhau. 444 00:23:37,392 --> 00:23:41,130 >> TƯỢNG: Sự khác nhau giữa là gì dấu gạch chéo ngược n và dấu gạch chéo ngược r? 445 00:23:41,130 --> 00:23:45,300 >> SPEAKER 1: Vậy câu hỏi là những gì các Sự khác biệt giữa phản ứng dữ dội và n 446 00:23:45,300 --> 00:23:48,615 r phản ứng dữ dội? 447 00:23:48,615 --> 00:23:50,906 Tôi nghĩ rằng dấu gạch chéo ngược r is-- 448 00:23:50,906 --> 00:23:54,340 >> TƯỢNG: Vì vậy, dấu gạch chéo ngược r chỉ có nghĩa trở về đầu dòng 449 00:23:54,340 --> 00:23:56,670 mà không thực sự đi đến một dòng mới. 450 00:23:56,670 --> 00:24:01,000 Vì vậy, nếu bạn in một dấu gạch chéo ngược r và bạn trở về đầu dòng 451 00:24:01,000 --> 00:24:04,005 sau đó bạn in nhiều công cụ, bạn ghi đè lên những thứ đó là đã có trên 452 00:24:04,005 --> 00:24:04,390 [Không nghe được]. 453 00:24:04,390 --> 00:24:06,725 Trong khi đó, n thực sự đi vào một mới đường và đi đến [không nghe được]. 454 00:24:06,725 --> 00:24:10,525 455 00:24:10,525 --> 00:24:13,915 >> SPEAKER 1: Vâng, bất kỳ câu hỏi nào khác không? 456 00:24:13,915 --> 00:24:15,430 Tất cả các quyền. 457 00:24:15,430 --> 00:24:18,617 Tôi sẽ đưa nó ra để Dan, những người sẽ tiếp tục. 458 00:24:18,617 --> 00:24:25,078 >> [Vỗ tay] 459 00:24:25,078 --> 00:25:08,814 460 00:25:08,814 --> 00:25:09,720 >> DAN: Tất cả chơi tay phải. 461 00:25:09,720 --> 00:25:18,590 Vì vậy, tôi sẽ nói về một rộng loạt các ý tưởng từ các lớp học đó là 462 00:25:18,590 --> 00:25:23,220 khoảng đại diện của tuần thứ hai và đầu tuần ba bắt đầu giảm 463 00:25:23,220 --> 00:25:28,690 với đúc, mà chỉ là một cách để điều trị một giá trị của một loại nhất định như 464 00:25:28,690 --> 00:25:30,830 một giá trị của một loại khác nhau. 465 00:25:30,830 --> 00:25:34,110 Vì vậy, chúng ta có thể làm điều này với ký tự để ints, phao để int, và 466 00:25:34,110 --> 00:25:35,360 chờ đợi lâu để tăng gấp đôi. 467 00:25:35,360 --> 00:25:38,170 468 00:25:38,170 --> 00:25:44,500 >> Tất cả những điều này có thể được sử dụng như cách điều trị một số giá trị số 469 00:25:44,500 --> 00:25:48,370 trừ char như một số khác giá trị số. 470 00:25:48,370 --> 00:25:54,480 Vì vậy, có một số vấn đề với điều này, các Tất nhiên, mà đi kèm khi bạn cast 471 00:25:54,480 --> 00:25:57,860 những thứ như phao để int. 472 00:25:57,860 --> 00:26:00,500 Vì vậy, đây là một chút lạ. 473 00:26:00,500 --> 00:26:03,170 Chúng tôi có một phao đó là 1,31. 474 00:26:03,170 --> 00:26:05,220 Chúng tôi nhân với 10.000. 475 00:26:05,220 --> 00:26:08,380 Và sau đó chúng tôi in nó như là một int. 476 00:26:08,380 --> 00:26:09,630 Những gì hiện ra điều này? 477 00:26:09,630 --> 00:26:11,600 478 00:26:11,600 --> 00:26:14,020 10.000 lần 1,31. 479 00:26:14,020 --> 00:26:18,761 Vì vậy, 13.000, là đoán? 480 00:26:18,761 --> 00:26:20,685 >> TƯỢNG: Tôi nghĩ đó là 10.000. 481 00:26:20,685 --> 00:26:24,234 >> DAN: Vì vậy, tôi nhân nó bằng 10.000 trước khi tôi đúc nó. 482 00:26:24,234 --> 00:26:25,202 >> TƯỢNG: Oh. 483 00:26:25,202 --> 00:26:27,622 Sẽ không có là một trong 9 và một số con số 0? 484 00:26:27,622 --> 00:26:29,270 >> DAN: Bạn có thể có một số chữ số kỳ lạ. 485 00:26:29,270 --> 00:26:32,410 486 00:26:32,410 --> 00:26:37,670 Vì vậy, ngay, đó là 1,3 lần 10.000. 487 00:26:37,670 --> 00:26:40,040 Vì vậy, đó là 13.000. 488 00:26:40,040 --> 00:26:41,313 Và weird-- thêm này 489 00:26:41,313 --> 00:26:42,160 >> TƯỢNG: 13.100. 490 00:26:42,160 --> 00:26:42,650 >> DAN: 13.100. 491 00:26:42,650 --> 00:26:44,910 Cảm ơn bạn, Rob. 492 00:26:44,910 --> 00:26:46,610 Và weirdness-- thêm này 493 00:26:46,610 --> 00:26:48,060 này 9,9-- 494 00:26:48,060 --> 00:26:53,860 chỉ đơn giản là vì đúc này đã kết thúc làm tròn xuống nơi 495 00:26:53,860 --> 00:26:55,394 nó không nên có. 496 00:26:55,394 --> 00:26:55,871 Yeah. 497 00:26:55,871 --> 00:26:58,256 >> ĐỐI TƯỢNG: Các đúc xảy ra sau khi bất cứ điều gì khác? 498 00:26:58,256 --> 00:27:03,865 >> DAN: Vì vậy, bởi vì tôi có điều này trong in ấn, nó thực hiện phép nhân này trước khi nó 499 00:27:03,865 --> 00:27:05,230 không đúc này. 500 00:27:05,230 --> 00:27:06,140 >> TƯỢNG: [không nghe được]. 501 00:27:06,140 --> 00:27:11,350 >> DAN: Tôi nghĩ rằng nó sẽ cast đầu tiên, yeah, đó sẽ là 10.000. 502 00:27:11,350 --> 00:27:12,610 Bất cứ điều gì khác? 503 00:27:12,610 --> 00:27:13,330 Mát mẻ. 504 00:27:13,330 --> 00:27:16,344 Vì vậy, đây là 13.099. 505 00:27:16,344 --> 00:27:17,840 Tại sao điều này xảy ra? 506 00:27:17,840 --> 00:27:18,900 Không chính xác. 507 00:27:18,900 --> 00:27:21,020 >> Nổi không phải là hoàn hảo. 508 00:27:21,020 --> 00:27:27,550 Họ chỉ có thể đại diện cho số một số lượng nhất định các con số đáng kể. 509 00:27:27,550 --> 00:27:35,120 Vì vậy, nếu chúng ta in ra 8 sung sig trên float này, chúng tôi có được một loại 510 00:27:35,120 --> 00:27:36,800 xấu số tìm kiếm. 511 00:27:36,800 --> 00:27:45,580 Và đó là bởi vì 1,31 có thể không chính xác được đại diện bởi đơn giản 512 00:27:45,580 --> 00:27:49,000 quyền hạn của hai trong máy. 513 00:27:49,000 --> 00:27:53,530 Vì vậy, nó kết thúc lên tham gia gần nhất đoán, mà kết thúc 514 00:27:53,530 --> 00:27:55,710 là một ít thấp. 515 00:27:55,710 --> 00:27:57,730 Có ý nghĩa? 516 00:27:57,730 --> 00:27:59,110 OK. 517 00:27:59,110 --> 00:28:05,840 >> Bây giờ, chuyển sang là một cách khác nhau làm câu điều kiện, nơi tất cả 518 00:28:05,840 --> 00:28:09,900 chúng tôi quan tâm là một biến duy nhất. 519 00:28:09,900 --> 00:28:16,570 Vì vậy, trong ví dụ này, chúng tôi nhận được một số nguyên từ người sử dụng. 520 00:28:16,570 --> 00:28:21,070 Và sau đó chúng tôi đang tìm kiếm những số nguyên là. 521 00:28:21,070 --> 00:28:23,500 Có lẽ, đó là số từ một đến bốn. 522 00:28:23,500 --> 00:28:24,800 Đó là những gì chúng tôi đang yêu cầu. 523 00:28:24,800 --> 00:28:28,450 >> Vì vậy, bạn làm một công tắc tên biến. 524 00:28:28,450 --> 00:28:34,290 Sau đó, bạn thiết lập các trường hợp có thể giá trị có thể. 525 00:28:34,290 --> 00:28:37,730 Vì vậy, là trường hợp một, nói rằng đó là thấp. 526 00:28:37,730 --> 00:28:41,080 Và sau đó bạn phá vỡ ra khỏi về điều kiện chuyển đổi để 527 00:28:41,080 --> 00:28:43,270 bạn không tiếp tục đi. 528 00:28:43,270 --> 00:28:44,830 >> Trong case-- tiếp theo 529 00:28:44,830 --> 00:28:46,940 vì vậy trường hợp hai trường hợp three-- 530 00:28:46,940 --> 00:28:51,920 nếu đó là trường hợp hai nó chỉ giảm xuống các dòng mã đầu tiên mà họ coi là có 531 00:28:51,920 --> 00:28:55,400 là trường hợp ba cho đến khi nó thấy được nghỉ ngơi. 532 00:28:55,400 --> 00:29:00,430 Vì vậy, lý do bạn nhận được một trường hợp để chỉ in thấp là bởi vì tôi 533 00:29:00,430 --> 00:29:01,890 có nghỉ này ở đây. 534 00:29:01,890 --> 00:29:05,360 Nếu tôi, nói rằng, bỏ qua break-- này nếu tôi ném breakaway-- này 535 00:29:05,360 --> 00:29:09,740 nó sẽ in thấp, và sau đó nó sẽ in trung bình, và sau đó nó sẽ phá vỡ. 536 00:29:09,740 --> 00:29:12,200 >> Vì vậy, nghỉ ngơi là một phần quan trọng chuyển đổi của các điều kiện và 537 00:29:12,200 --> 00:29:14,340 họ cần phải có. 538 00:29:14,340 --> 00:29:20,070 Bất kỳ trường hợp không được quy định rõ ràng được xử lý bởi mặc định 539 00:29:20,070 --> 00:29:26,645 trường hợp trong chuyển đổi và nên được đúc. 540 00:29:26,645 --> 00:29:31,363 >> TƯỢNG: Vì vậy, 1, 2, 3, và 4 sẽ là n? 541 00:29:31,363 --> 00:29:33,310 >> DAN: Các giá trị đó n có thể được. 542 00:29:33,310 --> 00:29:34,654 Có. 543 00:29:34,654 --> 00:29:35,146 Vâng? 544 00:29:35,146 --> 00:29:37,606 >> TƯỢNG: Vì vậy, khi bạn có rằng [không nghe được]? 545 00:29:37,606 --> 00:29:44,002 546 00:29:44,002 --> 00:29:46,830 >> DAN: Bạn sẽ in thấp, và sau đó nó sẽ in trung bình, và 547 00:29:46,830 --> 00:29:47,400 sau đó nó sẽ phá vỡ. 548 00:29:47,400 --> 00:29:50,244 >> TƯỢNG: Tại sao nó có thể in trung nếu [không nghe được]? 549 00:29:50,244 --> 00:29:54,036 550 00:29:54,036 --> 00:30:00,550 >> DAN: Vì vậy, tất cả mọi thứ trong một trường hợp trước khi nghỉ thuộc. 551 00:30:00,550 --> 00:30:09,390 Vì vậy, trường hợp một in là trường hợp bên dưới một như là in sau này. 552 00:30:09,390 --> 00:30:09,890 Vâng? 553 00:30:09,890 --> 00:30:11,140 >> TƯỢNG: [không nghe được]? 554 00:30:11,140 --> 00:30:15,890 555 00:30:15,890 --> 00:30:22,170 >> DAN: Vì vậy, con số này chỉ là một đặc biệt giá trị biến này 556 00:30:22,170 --> 00:30:23,420 có thể mất, phải không? 557 00:30:23,420 --> 00:30:26,740 558 00:30:26,740 --> 00:30:28,490 Điều đó có ý nghĩa? 559 00:30:28,490 --> 00:30:28,990 Yeah. 560 00:30:28,990 --> 00:30:31,490 >> TƯỢNG: [không nghe được]? 561 00:30:31,490 --> 00:30:34,130 >> DAN: Vâng, trường hợp hai sẽ in giữa và sau đó phá vỡ. 562 00:30:34,130 --> 00:30:35,380 >> TƯỢNG: [không nghe được]? 563 00:30:35,380 --> 00:30:37,954 564 00:30:37,954 --> 00:30:40,050 >> DAN: Tôi nghĩ rằng bất kỳ? 565 00:30:40,050 --> 00:30:43,855 Những loại dữ liệu khác bạn có thể chuyển qua? 566 00:30:43,855 --> 00:30:46,320 >> TƯỢNG: Bạn có thể chuyển đổi hơn bất kỳ loại dữ liệu. 567 00:30:46,320 --> 00:30:50,905 Tuy nhiên, nó chỉ có nghĩa là bất cứ điều gì trên ký tự và ints và công cụ như thế, bởi vì 568 00:30:50,905 --> 00:30:55,600 nếu bạn đang chuyển qua một con trỏ điều đó không thực sự có ý nghĩa, 569 00:30:55,600 --> 00:30:59,555 chuyển qua tải, nếu nó thậm chí chúng ta hãy bạn làm điều đó, bởi vì các dấu chấm động 570 00:30:59,555 --> 00:31:02,840 độ chính xác, bạn sẽ không thực sự muốn làm điều đó anyway. 571 00:31:02,840 --> 00:31:07,320 Vì vậy, khá nhiều, chỉ cần ints và ký tự và các công cụ như thế. 572 00:31:07,320 --> 00:31:12,360 >> DAN: Vâng, đó là khi bạn phải rõ ràng giá trị mà bạn biết, tôi nghĩ rằng, có thể là 573 00:31:12,360 --> 00:31:14,250 rằng một chuyển đổi là thực sự hữu ích. 574 00:31:14,250 --> 00:31:17,094 575 00:31:17,094 --> 00:31:18,990 Tốt? 576 00:31:18,990 --> 00:31:21,370 OK. 577 00:31:21,370 --> 00:31:26,180 >> Phạm vi là phạm vi mà một tuyên bố biến kéo dài. 578 00:31:26,180 --> 00:31:32,190 Vì vậy, trong đoạn này ít mã tôi có, nó sẽ được đầy đủ các lỗi. 579 00:31:32,190 --> 00:31:41,450 Và lý do là tôi tuyên bố int này i trong phạm vi này trong vòng lặp. 580 00:31:41,450 --> 00:31:46,390 Và sau đó tôi đang cố gắng để tham khảo mà i bên ngoài mà cho phạm vi vòng lặp. 581 00:31:46,390 --> 00:31:50,330 >> Vì vậy, về cơ bản, bạn có thể suy nghĩ về phạm vi như bất cứ điều gì mà bạn khai báo 582 00:31:50,330 --> 00:31:59,750 với bên trong một tập hợp các dấu ngoặc nhọn chỉ tồn tại trong những dấu ngoặc nhọn. 583 00:31:59,750 --> 00:32:04,990 Và nếu bạn cố gắng và sử dụng biến ngoài những dấu ngoặc nhọn, bạn sẽ 584 00:32:04,990 --> 00:32:08,356 nhận được một lỗi từ trình biên dịch. 585 00:32:08,356 --> 00:32:08,812 Vâng? 586 00:32:08,812 --> 00:32:09,724 >> TƯỢNG: Vì vậy, một điều này không làm việc? 587 00:32:09,724 --> 00:32:11,790 >> DAN: Điều này không làm việc, có. 588 00:32:11,790 --> 00:32:17,190 589 00:32:17,190 --> 00:32:18,660 Strings. 590 00:32:18,660 --> 00:32:19,780 Chuỗi char *. 591 00:32:19,780 --> 00:32:22,250 Chúng giống hệt nhau. 592 00:32:22,250 --> 00:32:25,540 Họ chỉ là con trỏ đến ký tự. 593 00:32:25,540 --> 00:32:33,000 Và bất kỳ dây mà bạn có nên kết thúc với dấu gạch chéo ngược không, mà chỉ là 594 00:32:33,000 --> 00:32:34,410 một quy ước c. 595 00:32:34,410 --> 00:32:36,680 >> Nó được gọi là terminator NULL. 596 00:32:36,680 --> 00:32:39,050 Và NULL-- 597 00:32:39,050 --> 00:32:41,670 vốn N, chữ U, vốn L, vốn L-- 598 00:32:41,670 --> 00:32:44,290 là không giống như các Terminator NULL. 599 00:32:44,290 --> 00:32:46,640 Đây là một con trỏ. 600 00:32:46,640 --> 00:32:48,280 Đây là một nhân vật. 601 00:32:48,280 --> 00:32:49,530 Họ rất khác nhau. 602 00:32:49,530 --> 00:32:50,200 Ghi nó. 603 00:32:50,200 --> 00:32:52,320 Nó sẽ được trên các bài kiểm tra, có lẽ. 604 00:32:52,320 --> 00:32:54,040 Tôi chưa thấy các bài kiểm tra. 605 00:32:54,040 --> 00:32:57,880 606 00:32:57,880 --> 00:32:58,840 Vâng? 607 00:32:58,840 --> 00:33:01,232 >> TƯỢNG: Vì vậy, NULL là, nói, con trỏ? 608 00:33:01,232 --> 00:33:01,995 >> DAN: Có. 609 00:33:01,995 --> 00:33:05,170 >> TƯỢNG: gì [không nghe được]? 610 00:33:05,170 --> 00:33:10,050 >> DAN: Nếu, nói, malloc được gọi là khi bạn không có đủ bộ nhớ để có được 611 00:33:10,050 --> 00:33:14,400 bất cứ kích thước bạn đang yêu cầu, malloc sẽ trở về NULL. 612 00:33:14,400 --> 00:33:19,550 Đó là, về cơ bản, bất cứ khi nào một chức năng là phải trả về một con trỏ, bạn 613 00:33:19,550 --> 00:33:22,600 cần phải kiểm tra lại vì NULL NULL là một good-- khá 614 00:33:22,600 --> 00:33:25,260 đó là, loại, giá trị rác. 615 00:33:25,260 --> 00:33:27,050 Đó là một số không như xa như con trỏ đi. 616 00:33:27,050 --> 00:33:29,630 617 00:33:29,630 --> 00:33:32,250 >> Bất cứ khi nào bạn gọi một chức năng, mà trả về một con trỏ. 618 00:33:32,250 --> 00:33:35,960 Bạn sẽ muốn kiểm tra để chắc chắn rằng con trỏ đó không phải là NULL 619 00:33:35,960 --> 00:33:37,760 vì NULL là rất phổ biến. 620 00:33:37,760 --> 00:33:40,160 Đó là loại rác thải trở lại. 621 00:33:40,160 --> 00:33:44,902 Vì vậy, nếu một cái gì đó đã không đi bên phải, chỉ trở về NULL thay thế. 622 00:33:44,902 --> 00:33:45,898 >> TƯỢNG: [không nghe được]? 623 00:33:45,898 --> 00:33:48,922 >> DAN: Vâng, và đó là lý này. 624 00:33:48,922 --> 00:33:51,750 >> TƯỢNG: [không nghe được]? 625 00:33:51,750 --> 00:33:52,800 >> DAN: chính tả nó như thế này. 626 00:33:52,800 --> 00:33:54,150 Đó là terminator NULL. 627 00:33:54,150 --> 00:33:56,560 Đó là chữ thường N-U-L-L nếu bạn đang đánh vần nó. 628 00:33:56,560 --> 00:33:59,860 >> TƯỢNG: Và tôi chỉ đi trở lại và thử nghiệm nó. 629 00:33:59,860 --> 00:34:03,010 Và nếu bạn thử đặt một dấu chấm động giá trị vào một chuyển đổi, nó sẽ hét vào mặt bạn 630 00:34:03,010 --> 00:34:05,916 nói rằng, tuyên bố yêu cầu biểu các loại nguyên. 631 00:34:05,916 --> 00:34:07,166 >> DAN: Có bạn đi. 632 00:34:07,166 --> 00:34:09,639 633 00:34:09,639 --> 00:34:12,246 Nhưng yeah, là những gì các câu hỏi một lần nữa? 634 00:34:12,246 --> 00:34:13,496 >> TƯỢNG: [không nghe được]? 635 00:34:13,496 --> 00:34:16,150 636 00:34:16,150 --> 00:34:23,679 >> DAN: Vì vậy, vốn N, chữ U, vốn L, L vốn là một điều thực tế c. 637 00:34:23,679 --> 00:34:29,719 Đây là con trỏ NULL và sẽ chỉ được đối xử như vậy. 638 00:34:29,719 --> 00:34:33,530 Bạn sẽ không bao giờ thử và đánh vần Nhân vật NULL và thấy bất kỳ 639 00:34:33,530 --> 00:34:35,630 cách nào khác hơn này. 640 00:34:35,630 --> 00:34:36,610 Vâng? 641 00:34:36,610 --> 00:34:42,490 >> TƯỢNG: Vì vậy, trở về char tối đa hoặc một cái gì đó trong phần thuyết minh, đúng không 642 00:34:42,490 --> 00:34:43,960 thể hiện các chức năng tương tự như [không nghe được]? 643 00:34:43,960 --> 00:34:50,655 644 00:34:50,655 --> 00:34:54,949 >> TƯỢNG: Vì vậy, bạn có đề cập đến trở về tối đa char từ getchar, hoặc 645 00:34:54,949 --> 00:34:55,444 bất cứ điều gì? 646 00:34:55,444 --> 00:34:55,940 >> TƯỢNG: Vâng. 647 00:34:55,940 --> 00:34:58,620 >> TƯỢNG: Vâng, vì vậy nói chung hạn cho tất cả những điều 648 00:34:58,620 --> 00:34:59,920 là những giá trị trọng điểm. 649 00:34:59,920 --> 00:35:03,640 Vì vậy, như trở về int max từ getInt và char tối đa từ getchar, đó là 650 00:35:03,640 --> 00:35:06,010 phải được như thế, tất cả các quyền, nếu những điều này đang quay trở lại với chúng tôi, 651 00:35:06,010 --> 00:35:07,210 một cái gì đó đã đi sai. 652 00:35:07,210 --> 00:35:09,950 >> Đối với con trỏ, chúng tôi chỉ xảy ra để có giá trị trọng điểm này mà tất cả mọi người 653 00:35:09,950 --> 00:35:10,750 đồng ý theo. 654 00:35:10,750 --> 00:35:13,210 Và đây là điều bạn quay trở lại khi mọi thứ đi sai. 655 00:35:13,210 --> 00:35:15,910 Vì vậy, tối đa char là những gì chúng ta đang sử dụng để đại diện cho một cái gì đó 656 00:35:15,910 --> 00:35:18,100 như NULL hoặc getchar. 657 00:35:18,100 --> 00:35:23,420 >> TƯỢNG: Vì vậy, nếu bạn đang thử nghiệm getchar, có thể bạn chỉ cần đặt NULL? 658 00:35:23,420 --> 00:35:23,910 Đó sẽ làm cho một sự khác biệt? 659 00:35:23,910 --> 00:35:25,400 >> DAN: Bạn có thể không chỉ cần kiểm tra NULL. 660 00:35:25,400 --> 00:35:30,130 Bạn sẽ phải kiểm tra char max vì giá trị trả về từ hàm là 661 00:35:30,130 --> 00:35:35,416 một nhân vật không phải là một con trỏ. 662 00:35:35,416 --> 00:35:35,888 Vâng? 663 00:35:35,888 --> 00:35:38,248 >> TƯỢNG: Câu hỏi này yêu cầu cho chiều dài chuỗi. 664 00:35:38,248 --> 00:35:40,136 Điều đó bao gồm các nhân vật NULL? 665 00:35:40,136 --> 00:35:41,000 >> DAN: số 666 00:35:41,000 --> 00:35:45,930 Và đó thực sự là như thế nào chiều dài chuỗi biết dừng lại vì nó đi qua 667 00:35:45,930 --> 00:35:49,070 mảng của bạn của các nhân vật cho đến khi nó thấy một nhân vật NULL. 668 00:35:49,070 --> 00:35:51,030 Và sau đó nó như thế nào, tất cả Được rồi, tôi đang thực hiện. 669 00:35:51,030 --> 00:35:52,130 >> TƯỢNG: [không nghe được] năm? 670 00:35:52,130 --> 00:35:53,990 >> DAN: Xin chào sẽ là năm. 671 00:35:53,990 --> 00:35:55,240 Đúng. 672 00:35:55,240 --> 00:35:59,580 673 00:35:59,580 --> 00:36:02,880 Vì vậy, mảng là liên tục khối của bộ nhớ. 674 00:36:02,880 --> 00:36:08,480 Họ có thể truy cập ngay lập tức bằng cách nói tên của mảng và sau đó, trong xoăn 675 00:36:08,480 --> 00:36:16,720 niềng răng, bất cứ điều gì chỉ số bạn muốn đi để, họ đang lập chỉ mục từ con số không thông qua 676 00:36:16,720 --> 00:36:20,100 chiều dài của mảng trừ đi 1. 677 00:36:20,100 --> 00:36:23,070 >> Và chúng được khai báo theo loại của điều mà bạn đang lưu trữ trong 678 00:36:23,070 --> 00:36:29,750 mảng, tên mảng, và sau đó bất cứ điều gì kích thước của mảng đó. 679 00:36:29,750 --> 00:36:36,660 Vì vậy, đây là một mảng char chiều dài sáu có những giá trị này. 680 00:36:36,660 --> 00:36:42,050 681 00:36:42,050 --> 00:36:42,700 Vâng? 682 00:36:42,700 --> 00:36:43,950 >> TƯỢNG: [không nghe được]? 683 00:36:43,950 --> 00:36:47,980 684 00:36:47,980 --> 00:36:48,460 >> DAN: Vâng. 685 00:36:48,460 --> 00:36:51,340 >> TƯỢNG: [không nghe được]? 686 00:36:51,340 --> 00:36:56,700 >> DAN: Nếu bạn có những gì đang xảy ra vào mảng đó đã được thực hiện. 687 00:36:56,700 --> 00:37:02,260 Vì vậy, bạn có thể chỉ định này thay vào đó là, nói, char, bất kể tên của bạn 688 00:37:02,260 --> 00:37:12,200 mảng, khung trống bằng xoăn cú đúp H E dấu phẩy phẩy phẩy L L dấu phẩy 689 00:37:12,200 --> 00:37:16,290 O dấu phẩy NULL nhân vật và cú đúp xoăn. 690 00:37:16,290 --> 00:37:18,180 Điều đó cũng sẽ làm việc như một tuyên bố. 691 00:37:18,180 --> 00:37:20,886 >> TƯỢNG: [không nghe được]? 692 00:37:20,886 --> 00:37:23,110 >> DAN: Sau đó, bạn cần phải có kích thước đã được thực hiện. 693 00:37:23,110 --> 00:37:23,896 >> TƯỢNG: [không nghe được]? 694 00:37:23,896 --> 00:37:25,146 >> DAN: Có. 695 00:37:25,146 --> 00:37:30,114 696 00:37:30,114 --> 00:37:32,420 Tất cả chơi tay phải. 697 00:37:32,420 --> 00:37:36,430 Đối số dòng lệnh là một cách nhận được thông tin từ người sử dụng như 698 00:37:36,430 --> 00:37:39,380 đối số chính. 699 00:37:39,380 --> 00:37:40,600 Chính nhận hai đối số. 700 00:37:40,600 --> 00:37:47,680 Số lượng các đối số đó là được thông qua cùng dòng lệnh và một 701 00:37:47,680 --> 00:37:55,340 vector chuỗi hoặc một mảng chuỗi của tất cả các đối số. 702 00:37:55,340 --> 00:38:07,840 >> Vì vậy, nếu tôi, nói rằng, gọi là một chức năng như: một dấu chấm ra 1 không gian, không gian 2, ba, 703 00:38:07,840 --> 00:38:10,110 argc sẽ là 4. 704 00:38:10,110 --> 00:38:17,370 Và argv 0 sẽ là một dấu chấm ra. 705 00:38:17,370 --> 00:38:19,130 Argv1 sẽ là 1. 706 00:38:19,130 --> 00:38:23,030 argv2 sẽ là 2 argv3 sẽ 3, trong trường hợp cụ thể. 707 00:38:23,030 --> 00:38:23,310 Vâng? 708 00:38:23,310 --> 00:38:25,400 >> TƯỢNG: [không nghe được]? 709 00:38:25,400 --> 00:38:34,010 >> DAN: Yếu tố cuối cùng trong mảng vì mảng là chiều dài cộng với argc 710 00:38:34,010 --> 00:38:41,050 một trong ARGB, yếu tố cuối cùng là con trỏ NULL. 711 00:38:41,050 --> 00:38:42,580 Đó là argc cộng với 1. 712 00:38:42,580 --> 00:38:46,210 713 00:38:46,210 --> 00:38:52,150 Vì vậy, trong trường hợp đó tôi chỉ nói, nó sẽ được argv 0 là một dấu chấm ra. 714 00:38:52,150 --> 00:38:56,330 argv 1 là 1 argv2 là 2 argv 3 là 3. 715 00:38:56,330 --> 00:39:03,490 argv 4, đó là một trong lớn hơn hơn argc sẽ là NULL. 716 00:39:03,490 --> 00:39:04,870 >> Và đó là con trỏ NULL. 717 00:39:04,870 --> 00:39:06,590 Có. 718 00:39:06,590 --> 00:39:11,250 Và đó là bởi vì chuỗi là một ngôi sao char là một con trỏ. 719 00:39:11,250 --> 00:39:14,102 Vì vậy, nó có phải là cùng loại. 720 00:39:14,102 --> 00:39:14,595 Vâng? 721 00:39:14,595 --> 00:39:16,074 >> TƯỢNG: Hai câu hỏi. 722 00:39:16,074 --> 00:39:21,004 Vì vậy, một, sự khác biệt giữa những gì này và GetString khác hơn một loại 723 00:39:21,004 --> 00:39:22,483 trong động cơ sử dụng? 724 00:39:22,483 --> 00:39:25,934 Và thứ hai, là nó được lưu trữ trong bộ nhớ gần đây của bạn? 725 00:39:25,934 --> 00:39:28,399 Vì vậy, như thế, sẽ GetString được [không nghe được]? 726 00:39:28,399 --> 00:39:31,357 727 00:39:31,357 --> 00:39:33,650 >> DAN: là nó được lưu trữ ở đâu? 728 00:39:33,650 --> 00:39:34,905 Tôi không biết nơi nó được lưu trữ. 729 00:39:34,905 --> 00:39:40,000 >> TƯỢNG: Vì vậy, trên thực tế, bạn biết làm thế nào bất kỳ chức năng bạn gọi đó là tranh luận 730 00:39:40,000 --> 00:39:42,170 được lưu trữ trong ngăn xếp? 731 00:39:42,170 --> 00:39:46,610 Vì vậy, argc và argv là đối số chính và họ đang ở trên đống, hoặc thực sự 732 00:39:46,610 --> 00:39:49,131 ngay phía trên những gì bạn nghĩ là sự bắt đầu của stack. 733 00:39:49,131 --> 00:39:53,490 Là những gì các phần khác của câu hỏi? 734 00:39:53,490 --> 00:39:56,821 >> TƯỢNG: Vậy điều gì là [không nghe được]? 735 00:39:56,821 --> 00:40:00,990 >> DAN: Vâng, nó chỉ là một cách khác nhau nhận đầu vào từ người sử dụng. 736 00:40:00,990 --> 00:40:06,030 Hiệu quả hơn một chút và của Điều này nó handier cho các kịch bản bởi vì bạn 737 00:40:06,030 --> 00:40:10,070 chỉ có thể truyền tham số chính của bạn chức năng thay vì phải chờ đợi 738 00:40:10,070 --> 00:40:13,400 cho người sử dụng nếu bạn không có bất kỳ người sử dụng. 739 00:40:13,400 --> 00:40:16,280 >> TƯỢNG: Và yeah, có những chuỗi sẽ là [không nghe được]. 740 00:40:16,280 --> 00:40:17,922 Nó sẽ lưu trữ những thứ bạn cần. 741 00:40:17,922 --> 00:40:18,834 >> DAN: Vâng? 742 00:40:18,834 --> 00:40:21,114 >> TƯỢNG: [không nghe được]? 743 00:40:21,114 --> 00:40:27,545 >> DAN: Vâng, argv 0 luôn luôn bao gồm các dot cắt giảm các cuộc gọi chức năng. 744 00:40:27,545 --> 00:40:28,042 Vâng? 745 00:40:28,042 --> 00:40:29,292 >> TƯỢNG: [không nghe được]? 746 00:40:29,292 --> 00:40:33,509 747 00:40:33,509 --> 00:40:37,310 >> DAN: Vâng, mỗi người trong số các đối số là kết thúc vào nhân vật NULL vì họ 748 00:40:37,310 --> 00:40:38,310 là chuỗi. 749 00:40:38,310 --> 00:40:40,892 >> TƯỢNG: [không nghe được]? 750 00:40:40,892 --> 00:40:44,116 >> DAN: Vâng, argv argc là một con trỏ NULL. 751 00:40:44,116 --> 00:40:45,112 >> TƯỢNG: [không nghe được]? 752 00:40:45,112 --> 00:40:47,104 >> DAN: Oh yeah. 753 00:40:47,104 --> 00:40:48,100 Vâng, xin lỗi. 754 00:40:48,100 --> 00:40:49,594 >> TƯỢNG: Vì vậy, [không nghe được]? 755 00:40:49,594 --> 00:41:08,518 756 00:41:08,518 --> 00:41:16,340 >> DAN: Vậy câu hỏi là nếu bạn có dòng lệnh chấm giảm một dấu chấm ra 1, 2, 757 00:41:16,340 --> 00:41:20,410 sẽ số dòng lệnh đối số có hai hoặc nó sẽ là ba? 758 00:41:20,410 --> 00:41:24,420 759 00:41:24,420 --> 00:41:28,240 >> TƯỢNG: Tôi nghĩ rằng nó không thực sự quan trọng. 760 00:41:28,240 --> 00:41:31,370 Tôi có xu hướng nói, oh, bạn đã không vượt qua bất kỳ đối số dòng lệnh khi, 761 00:41:31,370 --> 00:41:32,730 rõ ràng, bạn được gọi là chức năng. 762 00:41:32,730 --> 00:41:37,950 Vì vậy, tôi có xu hướng loại trừ những lời nói chức năng từ dòng lệnh 763 00:41:37,950 --> 00:41:40,350 đối số mặc dù nó bao gồm trong argv. 764 00:41:40,350 --> 00:41:42,600 >> DAN: Nhưng nếu nó đã được trên test-- 765 00:41:42,600 --> 00:41:46,550 yeah-- và còn nếu bạn nói điều gì đó như argc bằng 3, 766 00:41:46,550 --> 00:41:48,512 bạn đang ở trong vị thế an toàn. 767 00:41:48,512 --> 00:41:49,416 Vâng? 768 00:41:49,416 --> 00:41:50,666 >> TƯỢNG: [không nghe được]? 769 00:41:50,666 --> 00:42:00,990 770 00:42:00,990 --> 00:42:09,510 >> DAN: Tôi nghĩ rằng nếu thay vì gọi này trong argc và argv chuỗi dấu ngoặc 771 00:42:09,510 --> 00:42:14,350 nhưng vẫn giữ cùng loại và chỉ được gọi là họ một cái gì đó khác nhau như một 772 00:42:14,350 --> 00:42:16,640 và b, nó sẽ vẫn làm việc? 773 00:42:16,640 --> 00:42:18,790 Và nó vẫn sẽ làm việc, bạn sẽ just-- 774 00:42:18,790 --> 00:42:21,520 thay vì sử dụng argc-- bạn muốn sử dụng a và b. 775 00:42:21,520 --> 00:42:24,436 776 00:42:24,436 --> 00:42:25,408 Vâng? 777 00:42:25,408 --> 00:42:26,658 >> TƯỢNG: [không nghe được]? 778 00:42:26,658 --> 00:42:34,642 779 00:42:34,642 --> 00:42:38,850 >> DAN: Vậy câu hỏi là GetString là đi để lưu trữ bộ nhớ trong heap 780 00:42:38,850 --> 00:42:42,280 vì GetString là char *. 781 00:42:42,280 --> 00:42:47,530 Nó lưu trữ bộ nhớ trong đống vì nó cuộc gọi tại malloc trong thực tế 782 00:42:47,530 --> 00:42:49,258 thực hiện GetString. 783 00:42:49,258 --> 00:42:53,210 784 00:42:53,210 --> 00:42:55,090 OK, di chuyển trên. 785 00:42:55,090 --> 00:42:55,950 >> An ninh. 786 00:42:55,950 --> 00:43:01,090 Vì vậy, để thực sự an toàn, bạn dựa vào không một và bạn cho phép ai truy cập vào bất kỳ 787 00:43:01,090 --> 00:43:04,540 thông tin của bạn, đó là lý do tại sao tất cả mọi người xây dựng máy riêng của họ, 788 00:43:04,540 --> 00:43:09,580 hệ điều hành riêng của họ, tất cả họ chương trình từ đầu, và rõ ràng 789 00:43:09,580 --> 00:43:13,410 không kết nối với bất kỳ máy khác thông qua internet. 790 00:43:13,410 --> 00:43:17,350 Vì vậy, máy tính là không an toàn. 791 00:43:17,350 --> 00:43:19,200 Họ thực sự là. 792 00:43:19,200 --> 00:43:20,940 Chúng ta phải tin tưởng người khác. 793 00:43:20,940 --> 00:43:26,500 >> Và ý tưởng về an ninh là bạn đang cố gắng hạn chế số lượng 794 00:43:26,500 --> 00:43:27,540 niềm tin mà bạn cần. 795 00:43:27,540 --> 00:43:32,080 Và một trong những cách bạn làm điều đó là thông qua mật mã. 796 00:43:32,080 --> 00:43:34,950 Mật mã là, về cơ bản, chúng tôi có bí mật. 797 00:43:34,950 --> 00:43:38,880 >> Đôi khi chúng ta phải vượt qua những bí mật của chúng tôi cùng thông qua, nói rằng, mạng Internet hoặc 798 00:43:38,880 --> 00:43:39,980 những thứ khác. 799 00:43:39,980 --> 00:43:43,180 Và chúng tôi không muốn mọi người để biết những bí mật. 800 00:43:43,180 --> 00:43:50,100 Vì vậy, chúng tôi mã hóa bí mật của chúng tôi vào một cách mà chúng tôi hy vọng không ai có thể tìm ra. 801 00:43:50,100 --> 00:43:51,600 >> Vì vậy, chúng tôi used-- 802 00:43:51,600 --> 00:43:54,340 thông qua quá trình này class-- 803 00:43:54,340 --> 00:44:00,750 những thứ như mật mã Caesar và [Không nghe được], cả hai đều rất, rất 804 00:44:00,750 --> 00:44:03,200 cách an toàn mã hóa mọi thứ. 805 00:44:03,200 --> 00:44:07,930 Chúng dễ dàng để tìm ra những gì họ và những gì bí mật của bạn. 806 00:44:07,930 --> 00:44:12,130 Thế giới thực sử dụng nhiều hơn nữa chương trình mã hóa phức tạp. 807 00:44:12,130 --> 00:44:13,880 Và chúng ta sẽ không nhận được vào nhiều hơn thế. 808 00:44:13,880 --> 00:44:18,280 809 00:44:18,280 --> 00:44:19,430 >> Debugging. 810 00:44:19,430 --> 00:44:20,785 GDB là tốt nhất. 811 00:44:20,785 --> 00:44:24,014 812 00:44:24,014 --> 00:44:25,810 Tôi sẽ nhấn mạnh điều này một lần nữa. 813 00:44:25,810 --> 00:44:30,920 Sử dụng GDB tất cả các thời gian mỗi khi bạn có một vấn đề. 814 00:44:30,920 --> 00:44:36,030 Các lệnh hữu ích trong GDB là phá vỡ, mà một trong hai bạn vượt qua một dòng 815 00:44:36,030 --> 00:44:41,330 số lượng, một tên chức năng, về cơ bản nơi trong mã của bạn, bạn muốn dừng lại, 816 00:44:41,330 --> 00:44:45,600 và có thể kiểm soát. 817 00:44:45,600 --> 00:44:54,140 >> In có một biến và in ra bất cứ điều gì biến là ở đó 818 00:44:54,140 --> 00:44:55,990 điểm thi của bạn. 819 00:44:55,990 --> 00:45:00,130 Tiếp theo thực hiện di chuyển của bạn cùng một bước. 820 00:45:00,130 --> 00:45:05,050 Và bước bước bên trong một hàm trong thực hiện của bạn. 821 00:45:05,050 --> 00:45:10,480 >> Những điều khác đang chạy, đó là cách bạn thực sự chạy mã của bạn. 822 00:45:10,480 --> 00:45:16,630 Tiếp tục lấy tất cả các bước cần thiết để có được điểm break tiếp theo. 823 00:45:16,630 --> 00:45:18,300 Và có rất nhiều, nhiều người khác. 824 00:45:18,300 --> 00:45:19,040 Nhìn chúng. 825 00:45:19,040 --> 00:45:19,901 Họ đang tuyệt vời. 826 00:45:19,901 --> 00:45:20,863 Vâng? 827 00:45:20,863 --> 00:45:22,113 >> TƯỢNG: [không nghe được]? 828 00:45:22,113 --> 00:45:26,635 829 00:45:26,635 --> 00:45:28,200 >> DAN: Vâng, đó là một chương trình gỡ rối. 830 00:45:28,200 --> 00:45:34,230 Vì vậy, một chương trình gỡ rối là một chương trình cho phép bạn gỡ lỗi chương trình của bạn. 831 00:45:34,230 --> 00:45:39,931 Nó không phải là một chương trình tìm lỗi cho bạn, mặc dù đó sẽ là tuyệt vời. 832 00:45:39,931 --> 00:45:43,020 833 00:45:43,020 --> 00:45:46,040 >> Và cuối cùng đối với tôi là tìm kiếm. 834 00:45:46,040 --> 00:45:51,470 Vì vậy, các loại tìm kiếm mà chúng tôi nói chuyện trong lớp này là tìm kiếm tuyến tính, 835 00:45:51,470 --> 00:45:55,960 mà chỉ là bạn hãy kiểm tra mỗi phần tử của không gian tìm kiếm, một 836 00:45:55,960 --> 00:46:00,410 yếu tố tại một thời gian, cho đến khi bạn tìm thấy những gì bạn đang tìm kiếm hoặc cho đến khi bạn đạt đến 837 00:46:00,410 --> 00:46:03,350 kết thúc của không gian tìm kiếm của bạn mà chỉ cho bạn nói rằng bạn không thể tìm thấy 838 00:46:03,350 --> 00:46:06,360 các yếu tố mà bạn đang tìm kiếm. 839 00:46:06,360 --> 00:46:13,450 Và điều này cần có thời gian tốt nhất không đổi, mà là 0 của 1 và tuyến tính tồi tệ nhất 840 00:46:13,450 --> 00:46:16,070 thời gian, mà là 0 n. 841 00:46:16,070 --> 00:46:19,250 >> Tìm kiếm nhị phân, trong đó nhu cầu yếu tố bẩn thỉu. 842 00:46:19,250 --> 00:46:24,230 Bạn hãy vào giữa các yếu tố của bạn, thấy nếu các yếu tố bạn đang tìm kiếm 843 00:46:24,230 --> 00:46:30,120 là lớn hơn hoặc nhỏ hơn so với các phần tử rằng bạn đang ở giữa. 844 00:46:30,120 --> 00:46:36,510 Nó nó lớn hơn, bạn nói rằng phía dưới tìm kiếm của bạn không gian của bạn 845 00:46:36,510 --> 00:46:41,550 vị trí hiện tại, giữa, và bạn khởi động lại quá trình này. 846 00:46:41,550 --> 00:46:46,150 Nếu nó nhỏ, bạn nhìn nói mà gì-- yeah, có chuyện gì thế? 847 00:46:46,150 --> 00:46:47,400 >> TƯỢNG: [không nghe được]? 848 00:46:47,400 --> 00:46:51,000 849 00:46:51,000 --> 00:46:54,260 >> DAN: Có. 850 00:46:54,260 --> 00:46:58,360 Bất kỳ loại loại đó là được giảng dạy trong lớp học là trò chơi công bằng cho kỳ thi này. 851 00:46:58,360 --> 00:47:01,504 852 00:47:01,504 --> 00:47:04,920 >> [Cười] 853 00:47:04,920 --> 00:47:10,260 >> DAN: Và thực tế là bạn không có để làm điều đó cho một bộ vấn đề, đó là công bằng 854 00:47:10,260 --> 00:47:12,420 trò chơi cho các thử nghiệm. 855 00:47:12,420 --> 00:47:15,186 >> TƯỢNG: Chúng ta có thể đi qua nó như thế nào đối với: 856 00:47:15,186 --> 00:47:17,052 >> DAN: Nó sẽ được đi qua. 857 00:47:17,052 --> 00:47:20,496 >> SPEAKER 2: mã thực tế cho [Không nghe được] là study.cs50.net. 858 00:47:20,496 --> 00:47:25,910 859 00:47:25,910 --> 00:47:32,680 Vì vậy, nếu bạn nhìn vào các vấn đề thực tế trong trang kết hợp loại 860 00:47:32,680 --> 00:47:35,880 study.cs50.net, có mã thực hiện hợp nhất phân loại. 861 00:47:35,880 --> 00:47:38,550 Vì vậy, bạn không cần phải thực hiện điều đó cho mình tối nay. 862 00:47:38,550 --> 00:47:42,090 Nhưng chắc chắn rằng bạn hiểu nó khá hơn là chỉ học thuộc lòng nó. 863 00:47:42,090 --> 00:47:45,035 >> TƯỢNG: [không nghe được]? 864 00:47:45,035 --> 00:47:49,720 >> SPEAKER 2: Trang sắp xếp hợp nhất vào study.cs50.net, có một thực tế 865 00:47:49,720 --> 00:47:53,570 vấn đề đó, nếu bạn nhấp qua các vấn đề, ở cuối có một 866 00:47:53,570 --> 00:47:56,280 giải pháp, đó là hợp nhất loại thực hiện. 867 00:47:56,280 --> 00:47:58,510 Nhưng chắc chắn rằng bạn hiểu nó chứ không phải chỉ học thuộc lòng nó 868 00:47:58,510 --> 00:47:59,760 hoặc sao chép nó xuống. 869 00:47:59,760 --> 00:48:02,870 870 00:48:02,870 --> 00:48:06,340 >> TƯỢNG: Và một hoàn toàn hợp lệ vấn đề cho kỳ thi sẽ được 871 00:48:06,340 --> 00:48:07,990 một cái gì đó giống như đây là một danh sách. 872 00:48:07,990 --> 00:48:12,100 Những gì hiện danh sách này như thế nào sau khi một bước các lựa chọn sắp xếp hoặc 873 00:48:12,100 --> 00:48:13,330 sắp xếp chèn hoặc bất cứ điều gì. 874 00:48:13,330 --> 00:48:14,940 Một sự lặp lại đầy đủ danh sách. 875 00:48:14,940 --> 00:48:18,530 Vì vậy, ngay cả khi bạn không kết thúc cần phải mã cho nó, bạn cần phải hiểu nó 876 00:48:18,530 --> 00:48:20,440 đủ để biết làm thế nào nó sẽ được sửa đổi mảng này. 877 00:48:20,440 --> 00:48:24,144 878 00:48:24,144 --> 00:48:25,394 >> DAN: Đó là nó cho tôi. 879 00:48:25,394 --> 00:48:30,604 880 00:48:30,604 --> 00:48:32,588 >> [Vỗ tay] 881 00:48:32,588 --> 00:49:06,316 882 00:49:06,316 --> 00:49:07,410 >> Lucas: Chào tất cả mọi người. 883 00:49:07,410 --> 00:49:08,390 Tên tôi là Lucas. 884 00:49:08,390 --> 00:49:16,840 Tôi sẽ nói về đệ quy, tất cả những loại mà chúng tôi đã học được, và một 885 00:49:16,840 --> 00:49:18,050 chút của tất cả các con trỏ. 886 00:49:18,050 --> 00:49:18,740 OK? 887 00:49:18,740 --> 00:49:20,340 Vì vậy, trước hết, đệ quy. 888 00:49:20,340 --> 00:49:22,951 Có nghĩa là gì khi nói rằng một chức năng là đệ quy? 889 00:49:22,951 --> 00:49:24,675 >> TƯỢNG: cuộc gọi của chính nó. 890 00:49:24,675 --> 00:49:26,500 >> Lucas: OK, tự gọi mình, yeah. 891 00:49:26,500 --> 00:49:27,700 Vì vậy, giống như hình ảnh này, ví dụ. 892 00:49:27,700 --> 00:49:30,280 Nó giống như hình ảnh bên trong của một bức tranh và như vậy. 893 00:49:30,280 --> 00:49:35,740 Vì vậy, ví dụ, bạn có thể have-- khi Dan đã được nói về tìm kiếm nhị phân. 894 00:49:35,740 --> 00:49:41,840 Một trong những cách đó là tìm kiếm nhị phân đệ quy là một thực tế rằng bạn đang 895 00:49:41,840 --> 00:49:43,130 cố gắng để tìm thấy một số. 896 00:49:43,130 --> 00:49:44,250 Vì vậy, bạn đi đến giữa. 897 00:49:44,250 --> 00:49:47,130 Và sau đó bạn kiểm tra xem những con số có ở bên trái và bên phải. 898 00:49:47,130 --> 00:49:49,650 >> Và sau đó nếu bạn tìm ra số là sẽ được ở bên trái, đó là cùng 899 00:49:49,650 --> 00:49:53,340 điều là làm việc tìm kiếm một lần nữa nhưng chỉ ở bên trái của danh sách. 900 00:49:53,340 --> 00:49:57,350 Vì vậy, đó là cách nó âm thanh như đó là đệ quy. 901 00:49:57,350 --> 00:50:01,870 Vì vậy, đó là lý do tại sao các bạn có đệ quy giải pháp cho sắp xếp hợp nhất. 902 00:50:01,870 --> 00:50:04,270 >> OK, vì vậy đây là một ví dụ. 903 00:50:04,270 --> 00:50:07,280 Vì vậy, hãy nói rằng tôi muốn chọn tất cả các số từ 1 đến n. 904 00:50:07,280 --> 00:50:13,790 Tôi có thể nhận ra rằng tổng của n số là n cộng với n trừ đi 1 đến 1. 905 00:50:13,790 --> 00:50:17,810 Nhưng sau đó, nếu tôi nhìn vào n trừ đi 1 cộng n trừ 2 cộng với 1, đó là cùng một 906 00:50:17,810 --> 00:50:20,680 điều là con số tổng hợp đến n trừ đi 1. 907 00:50:20,680 --> 00:50:25,890 Vì vậy, tôi có thể nói rằng tổng của một số tiền tương đương bằng n cộng với tổng của n trừ đi 1. 908 00:50:25,890 --> 00:50:28,010 Điều đó có ý nghĩa? 909 00:50:28,010 --> 00:50:32,630 >> Và tôi cũng sẽ có một cái gì đó khác được gọi là trường hợp cơ sở, đó là 910 00:50:32,630 --> 00:50:37,440 tổng số lên bằng không sẽ là không. 911 00:50:37,440 --> 00:50:42,770 Vì vậy, ngay sau khi tôi nhận được với số bằng không, tôi dừng đếm. 912 00:50:42,770 --> 00:50:45,330 Điều đó có ý nghĩa? 913 00:50:45,330 --> 00:50:48,120 >> Vì vậy, đây là một ví dụ về cách Tôi có thể thực hiện điều đó. 914 00:50:48,120 --> 00:50:49,860 Vì vậy, tôi có chức năng này trong một số. 915 00:50:49,860 --> 00:50:51,700 Mà phải mất một số nguyên n. 916 00:50:51,700 --> 00:50:56,300 Vì vậy, đây lần đầu tiên tôi kiểm tra nếu n là ít hơn hoặc bằng số không. 917 00:50:56,300 --> 00:51:00,310 Vì vậy, nếu nó ít hơn hoặc bằng số không, tôi trở lại không, đó là trường hợp cơ sở của chúng tôi. 918 00:51:00,310 --> 00:51:05,690 Nếu không, tôi chỉ có thể trở lại cộng với n tổng các số từ 919 00:51:05,690 --> 00:51:07,190 một đến n trừ đi một. 920 00:51:07,190 --> 00:51:09,360 Có ý nghĩa? 921 00:51:09,360 --> 00:51:10,100 OK. 922 00:51:10,100 --> 00:51:11,610 >> Vì vậy, đây là những gì nó trông như thế nào. 923 00:51:11,610 --> 00:51:15,260 Bạn có tổng của 2 bình đẳng 2 cộng với số tiền 1. 924 00:51:15,260 --> 00:51:18,930 Và một số 1 là 1 cộng với tổng số 0, mà là 0. 925 00:51:18,930 --> 00:51:20,216 Có ý nghĩa? 926 00:51:20,216 --> 00:51:25,342 Vì vậy, nếu chúng ta nhìn vào chồng của bạn chương trình, đây là những gì nó trông như thế nào. 927 00:51:25,342 --> 00:51:26,820 >> Đầu tiên, chúng tôi có các chức năng chính. 928 00:51:26,820 --> 00:51:30,320 Và sau đó các chức năng chính gọi là tiền 2. 929 00:51:30,320 --> 00:51:36,690 Và sau đó tổng hợp 2 sẽ nói, oh, tổng hợp 2 bằng 2 cộng với số tiền của một. 930 00:51:36,690 --> 00:51:39,460 Vì vậy, tôi thêm khoản 1 vào stack. 931 00:51:39,460 --> 00:51:43,860 Và tổng số 1 là sẽ gọi cho tổng của 0, có cũng sẽ được bổ sung 932 00:51:43,860 --> 00:51:44,630 để ngăn xếp. 933 00:51:44,630 --> 00:51:49,240 Và sau đó mỗi người có trên đầu trang của người khác phải trả lại 934 00:51:49,240 --> 00:51:52,020 trước khi những người khác có thể tiếp tục đi. 935 00:51:52,020 --> 00:51:56,240 >> Vì vậy, ví dụ, ở đây, tổng số 0, đầu tiên, sẽ trở về 0. 936 00:51:56,240 --> 00:51:58,320 Và sau đó chọn số tiền 1. 937 00:51:58,320 --> 00:52:00,850 Sau đó, tổng số 1 đang tiến hành trả lại 1 tổng hợp 2. 938 00:52:00,850 --> 00:52:03,900 Và cuối cùng, tổng của 2 sẽ trở lại từ 3 đến chính. 939 00:52:03,900 --> 00:52:05,320 Điều đó có ý nghĩa? 940 00:52:05,320 --> 00:52:09,496 >> Nó thực sự quan trọng để hiểu làm thế nào ngăn xếp được làm việc và cố gắng 941 00:52:09,496 --> 00:52:11,980 xem nó có ý nghĩa. 942 00:52:11,980 --> 00:52:13,260 OK, vì vậy phân loại. 943 00:52:13,260 --> 00:52:16,170 Vì vậy, tại sao sắp xếp quan trọng, trước hết? 944 00:52:16,170 --> 00:52:18,260 Tại sao chúng ta phải quan tâm? 945 00:52:18,260 --> 00:52:20,310 Bất cứ ai? 946 00:52:20,310 --> 00:52:20,695 Hãy cho tôi một ví dụ? 947 00:52:20,695 --> 00:52:21,040 Vâng? 948 00:52:21,040 --> 00:52:22,968 >> TƯỢNG: [không nghe được]. 949 00:52:22,968 --> 00:52:24,700 >> Lucas: Vâng, OK. 950 00:52:24,700 --> 00:52:26,090 Vì vậy, bạn có thể tìm kiếm hiệu quả hơn. 951 00:52:26,090 --> 00:52:28,580 Đó là một cách tốt. 952 00:52:28,580 --> 00:52:32,462 Vì vậy, ví dụ, chúng ta có rất nhiều điều, trên thực tế, trong cuộc sống của chúng tôi 953 00:52:32,462 --> 00:52:32,920 đều được sắp xếp. 954 00:52:32,920 --> 00:52:34,830 Ví dụ, từ điển. 955 00:52:34,830 --> 00:52:39,210 >> Nó rất quan trọng để có tất cả các từ một số loại để chúng ta 956 00:52:39,210 --> 00:52:41,970 có thể truy cập dễ dàng. 957 00:52:41,970 --> 00:52:43,280 Vì vậy, đó là những gì ông đã nói. 958 00:52:43,280 --> 00:52:45,530 Bạn có thể tìm kiếm hiệu quả hơn. 959 00:52:45,530 --> 00:52:48,740 Hãy suy nghĩ về cách cứng nó sẽ có một từ điển trong đó các từ trong 960 00:52:48,740 --> 00:52:49,500 thứ tự ngẫu nhiên. 961 00:52:49,500 --> 00:52:53,120 Bạn sẽ phải nhìn vào, khá nhiều, mỗi từ duy nhất cho đến khi bạn tìm thấy 962 00:52:53,120 --> 00:52:54,720 từ mà bạn đang tìm kiếm. 963 00:52:54,720 --> 00:52:58,710 >> Nếu bạn đang sử dụng Facebook cũng có khi, bạn đang tìm kiếm bạn bè của bạn, bạn 964 00:52:58,710 --> 00:53:03,540 sẽ thấy rằng Facebook đặt của bạn người bạn gần gũi hơn là trên đầu trang của những người 965 00:53:03,540 --> 00:53:05,470 bạn không nói chuyện với nhiều. 966 00:53:05,470 --> 00:53:08,080 Nếu bạn đi tất cả các cách để dưới cùng của danh sách bạn bè của bạn, bạn sẽ thấy 967 00:53:08,080 --> 00:53:11,250 những người mà bạn có thể thậm chí không hãy nhớ rằng bạn là bạn của. 968 00:53:11,250 --> 00:53:14,590 Và đó là bởi vì các loại Facebook bạn bè của bạn dựa trên cách 969 00:53:14,590 --> 00:53:16,472 đóng bạn cho họ. 970 00:53:16,472 --> 00:53:17,930 >> Vì vậy, tổ chức dữ liệu. 971 00:53:17,930 --> 00:53:18,450 Ngoài ra Pokemon. 972 00:53:18,450 --> 00:53:21,400 Vì vậy, bạn thấy rằng tất cả Pokemon có số lượng. 973 00:53:21,400 --> 00:53:27,210 Và đó là như một cách dễ dàng cách truy cập dữ liệu. 974 00:53:27,210 --> 00:53:29,050 >> TƯỢNG: Truy cập Pokemon. 975 00:53:29,050 --> 00:53:29,890 >> Lucas: Vâng. 976 00:53:29,890 --> 00:53:32,395 >> TƯỢNG: [không nghe được]. 977 00:53:32,395 --> 00:53:33,460 >> Lucas: Đúng. 978 00:53:33,460 --> 00:53:35,140 OK, vì vậy lựa chọn sắp xếp. 979 00:53:35,140 --> 00:53:41,610 Loại lựa chọn sẽ chọn không được phân loại giá trị nhỏ nhất của một danh sách mỗi 980 00:53:41,610 --> 00:53:43,300 thời gian trong mỗi lần lặp. 981 00:53:43,300 --> 00:53:46,800 Đó là loại giống như các loại mà bạn làm trong đầu của bạn khi bạn đang cố gắng để 982 00:53:46,800 --> 00:53:48,430 sắp xếp một danh sách trên tay. 983 00:53:48,430 --> 00:53:51,990 >> Về cơ bản, tất cả các bạn làm là bạn nhìn cho số nhỏ nhất. 984 00:53:51,990 --> 00:53:54,280 Bạn đặt nó trong danh sách được sắp xếp. 985 00:53:54,280 --> 00:53:56,230 Và sau đó bạn tìm tiếp theo số nhỏ nhất. 986 00:53:56,230 --> 00:54:00,080 Và sau đó bạn tiếp tục làm đó và như vậy. 987 00:54:00,080 --> 00:54:04,600 >> Vì vậy, lựa chọn loại cơ bản là bạn chọn mỗi khi nhỏ nhất 988 00:54:04,600 --> 00:54:05,750 giá trị phân loại. 989 00:54:05,750 --> 00:54:10,840 Đặt ở cuối sắp xếp một phần của danh sách. 990 00:54:10,840 --> 00:54:12,370 Và tiếp tục làm điều đó. 991 00:54:12,370 --> 00:54:15,890 Vì vậy, hãy nhanh chóng xem những gì này như thế nào. 992 00:54:15,890 --> 00:54:19,340 Vì vậy, đây là sắp xếp và danh sách phân loại. 993 00:54:19,340 --> 00:54:23,350 >> Vì vậy, cho sắp xếp danh sách, đó là ban đầu trống rỗng. 994 00:54:23,350 --> 00:54:26,760 Và sau đó tôi sẽ chọn số lượng nhỏ nhất ở đây, đó là 2. 995 00:54:26,760 --> 00:54:30,650 Vì vậy, tôi có được số 2 và tôi đặt ở phía trước của danh sách. 996 00:54:30,650 --> 00:54:34,910 Và sau đó tôi tìm kiếm nhỏ nhất tiếp theo yếu tố, đó là 3. 997 00:54:34,910 --> 00:54:37,050 Vì vậy, tôi đặt nó ở cuối của danh sách được sắp xếp. 998 00:54:37,050 --> 00:54:38,140 Và sau đó tôi tiếp tục làm điều đó. 999 00:54:38,140 --> 00:54:40,040 Tôi tìm thấy 4 và đặt nó ở cuối. 1000 00:54:40,040 --> 00:54:41,360 Tìm 5 và đặt nó ở cuối. 1001 00:54:41,360 --> 00:54:44,830 >> Và xem làm thế nào tất cả những lần Tôi nói đặt nó ở cuối cùng là, 1002 00:54:44,830 --> 00:54:46,850 về cơ bản, trao đổi hai giá trị. 1003 00:54:46,850 --> 00:54:48,100 OK? 1004 00:54:48,100 --> 00:54:50,140 1005 00:54:50,140 --> 00:54:52,825 Và rồi cuối cùng, bạn chỉ cần có một yếu tố hơn. 1006 00:54:52,825 --> 00:54:55,870 Vì vậy, nó đã được sắp xếp. 1007 00:54:55,870 --> 00:54:57,800 >> OK, vì vậy sắp xếp chèn. 1008 00:54:57,800 --> 00:55:03,180 Sắp xếp chèn bạn sẽ có cũng rằng vấn đề của việc có một sắp xếp và 1009 00:55:03,180 --> 00:55:04,690 một danh sách phân loại. 1010 00:55:04,690 --> 00:55:14,540 Điều duy nhất là mỗi khi bạn đang thêm một yếu tố để các sắp xếp 1011 00:55:14,540 --> 00:55:18,170 danh sách, bạn chỉ cần chọn các yếu tố đó là ở phía trước của danh sách phân loại. 1012 00:55:18,170 --> 00:55:20,880 Và sau đó bạn sẽ tìm thấy những gì vị trí của nó phải ở trong sắp xếp 1013 00:55:20,880 --> 00:55:22,300 một phần của danh sách. 1014 00:55:22,300 --> 00:55:25,840 >> Hãy xem những gì này là như vậy điều này làm cho ý nghĩa hơn. 1015 00:55:25,840 --> 00:55:29,360 Vì vậy, ban đầu, ví dụ, tôi đang cố gắng chèn số ba trong 1016 00:55:29,360 --> 00:55:30,680 một phần được sắp xếp trong danh sách. 1017 00:55:30,680 --> 00:55:31,800 Vì vậy, danh sách này không có bất cứ điều gì. 1018 00:55:31,800 --> 00:55:34,160 Vì vậy, tôi chỉ có thể đưa ra con số 3. 1019 00:55:34,160 --> 00:55:37,480 >> Bây giờ, tôi muốn thêm số 5 phần được sắp xếp trong danh sách. 1020 00:55:37,480 --> 00:55:38,900 Vì vậy, tôi nhìn vào số lượng 5. 1021 00:55:38,900 --> 00:55:40,450 Tôi nhận thấy rằng nó lớn hơn 3. 1022 00:55:40,450 --> 00:55:41,980 Vì vậy, tôi biết rằng nó đã được sau 3. 1023 00:55:41,980 --> 00:55:44,100 Vì vậy, tôi đặt 3 và 5. 1024 00:55:44,100 --> 00:55:45,940 >> Sau đó, tôi muốn chèn số 2. 1025 00:55:45,940 --> 00:55:51,630 Tôi nhận thấy rằng số 2 là thực sự cuối cùng thì cả 3 và 5. 1026 00:55:51,630 --> 00:55:54,580 Vì vậy, tôi thực sự phải đặt nó tất cả các cách vào đầu danh sách. 1027 00:55:54,580 --> 00:55:59,030 Vì vậy, tôi phải, loại, chuyển tất cả các các yếu tố trong danh sách được sắp xếp để tôi có thể 1028 00:55:59,030 --> 00:56:01,970 nhường chỗ cho số 2. 1029 00:56:01,970 --> 00:56:03,160 >> Sau đó, tôi nhìn thấy số 6. 1030 00:56:03,160 --> 00:56:05,450 Tôi thấy rằng nó phải là sau 5. 1031 00:56:05,450 --> 00:56:06,240 Vì vậy, tôi đặt nó ở đó. 1032 00:56:06,240 --> 00:56:07,965 Và cuối cùng, tôi nhìn vào số 4. 1033 00:56:07,965 --> 00:56:11,030 Và tôi nhận thấy là cần là giữa 3 và 5. 1034 00:56:11,030 --> 00:56:14,870 Và sau đó tôi đặt nó ở đó và thay đổi tất cả các yếu tố khác. 1035 00:56:14,870 --> 00:56:16,120 Có ý nghĩa? 1036 00:56:16,120 --> 00:56:17,880 1037 00:56:17,880 --> 00:56:19,150 >> Phân loại Bubble. 1038 00:56:19,150 --> 00:56:25,730 Vì vậy, bong bóng sắp xếp về cơ bản là những gì bạn đang sẽ do-- chúng tôi gọi nó là bong bóng 1039 00:56:25,730 --> 00:56:30,113 loại vì bạn đi qua các list-- nó thực sự tốt hơn nếu tôi chỉ hiển thị 1040 00:56:30,113 --> 00:56:32,300 bạn thích this-- 1041 00:56:32,300 --> 00:56:35,030 và bạn sẽ so sánh số liền kề. 1042 00:56:35,030 --> 00:56:38,410 Và bạn sẽ trao đổi của họ vị trí nếu họ không 1043 00:56:38,410 --> 00:56:39,190 theo thứ tự đúng. 1044 00:56:39,190 --> 00:56:42,570 >> Vì vậy, về cơ bản, những gì đang xảy đến xảy ra là ở đây, ví dụ, 1045 00:56:42,570 --> 00:56:44,160 bạn có 8 và 6. 1046 00:56:44,160 --> 00:56:47,270 Bạn có biết rằng thứ tự sắp xếp sẽ thực sự là 6 và 5, phải không? 1047 00:56:47,270 --> 00:56:49,540 Vì vậy, bạn sẽ trao đổi các đơn đặt hàng. 1048 00:56:49,540 --> 00:56:51,370 Sau đó, tôi nhìn thấy 8 và 4 ở đây. 1049 00:56:51,370 --> 00:56:52,250 Và tôi làm điều tương tự. 1050 00:56:52,250 --> 00:56:53,400 Tôi trao đổi một lần nữa. 1051 00:56:53,400 --> 00:56:55,070 Và cuối cùng, 2 và 8. 1052 00:56:55,070 --> 00:56:56,670 Tôi cũng trao đổi chúng. 1053 00:56:56,670 --> 00:57:01,690 >> Nó được gọi là Phân loại Bubble bởi vì sau khi mỗi lần lặp lại, trên thực tế, 1054 00:57:01,690 --> 00:57:05,910 số lượng lớn nhất trong danh sách được tất cả đường đến cuối danh sách. 1055 00:57:05,910 --> 00:57:06,940 Điều đó có ý nghĩa? 1056 00:57:06,940 --> 00:57:11,880 Bởi vì nó giữ nó trao đổi và di chuyển nó sang bên phải. 1057 00:57:11,880 --> 00:57:14,440 >> OK, vì vậy đây là phiên thứ hai. 1058 00:57:14,440 --> 00:57:17,200 Nó sẽ là điều tương tự. 1059 00:57:17,200 --> 00:57:20,190 Tôi sẽ làm một trao đổi và sau đó người cuối cùng. 1060 00:57:20,190 --> 00:57:23,290 Tôi rằng không có giao dịch hoán đổi và danh sách được sắp xếp. 1061 00:57:23,290 --> 00:57:27,460 Vì vậy, trong bong bóng theo, chúng tôi về cơ bản giữ sẽ thông qua danh sách và trao đổi 1062 00:57:27,460 --> 00:57:32,310 thứ cho đến khi tôi nhận thấy rằng tôi đã không làm bất kỳ giao dịch hoán đổi làm lặp đi lặp lại rằng, đó 1063 00:57:32,310 --> 00:57:34,270 có nghĩa là danh sách đã được sắp xếp. 1064 00:57:34,270 --> 00:57:35,520 Có ý nghĩa? 1065 00:57:35,520 --> 00:57:38,400 1066 00:57:38,400 --> 00:57:40,870 >> Hãy nói một chút về thời gian chạy. 1067 00:57:40,870 --> 00:57:45,165 Vì vậy, các bạn nhớ Big O, Omega, và Theta? 1068 00:57:45,165 --> 00:57:49,290 1069 00:57:49,290 --> 00:57:50,990 Vâng? 1070 00:57:50,990 --> 00:57:53,070 OK, Big O là gì, trước hết? 1071 00:57:53,070 --> 00:57:54,315 >> TƯỢNG: [không nghe được]. 1072 00:57:54,315 --> 00:57:59,070 >> Lucas: Vâng, nó được gọi là một trường hợp xấu nhất thời gian chạy, mà chỉ có nghĩa là nó 1073 00:57:59,070 --> 00:58:03,470 bao nhiêu bạn mong đợi chương trình để chạy. 1074 00:58:03,470 --> 00:58:04,910 Giống như, về of-- 1075 00:58:04,910 --> 00:58:06,660 trong case-- n này. 1076 00:58:06,660 --> 00:58:09,150 Số lượng các yếu tố trong danh sách trong trường hợp xấu nhất. 1077 00:58:09,150 --> 00:58:12,520 Giống như, trong trường hợp xấu nhất có thể. 1078 00:58:12,520 --> 00:58:17,100 >> Vì vậy, cho bong bóng theo, ví dụ, chúng tôi có Big O n vuông. 1079 00:58:17,100 --> 00:58:20,580 Tại sao chúng ta không? 1080 00:58:20,580 --> 00:58:24,716 Tại sao bong bóng theo Big O n vuông? 1081 00:58:24,716 --> 00:58:27,614 >> TƯỢNG: [không nghe được]. 1082 00:58:27,614 --> 00:58:35,670 >> Lucas: Vâng, vì vậy trường hợp xấu nhất sẽ là rằng tôi sẽ phải làm n lần lặp lại. 1083 00:58:35,670 --> 00:58:39,260 Vì vậy, mỗi lần lặp lại sẽ mang yếu tố lớn nhất để kết thúc 1084 00:58:39,260 --> 00:58:40,290 danh sách. 1085 00:58:40,290 --> 00:58:44,230 Vì vậy, trường hợp xấu nhất là tôi có để làm điều đó điều n lần. 1086 00:58:44,230 --> 00:58:48,550 Và đối với mỗi người trong những lần, tôi phải làm n giao dịch hoán đổi bởi vì tôi có thể so sánh 1087 00:58:48,550 --> 00:58:49,870 mỗi hai yếu tố. 1088 00:58:49,870 --> 00:58:53,730 Vì vậy, đó là lý do tại sao nó n bình phương bởi vì nó n lần n. 1089 00:58:53,730 --> 00:59:00,120 >> Sau đó, lựa chọn loại cũng n vuông là bởi vì, mỗi lần lặp, tôi phải 1090 00:59:00,120 --> 00:59:02,650 nhìn vào tất cả các yếu tố duy nhất trong danh sách. 1091 00:59:02,650 --> 00:59:04,980 Và sau đó tìm nhỏ nhất, có nghĩa là tôi phải 1092 00:59:04,980 --> 00:59:06,130 xem xét thông qua các yếu tố n. 1093 00:59:06,130 --> 00:59:11,750 Và tôi phải làm điều đó n lần vì Tôi phải chọn tất cả các yếu tố n. 1094 00:59:11,750 --> 00:59:18,273 >> Một loại chèn cũng n vuông là vì trường hợp xấu nhất sẽ 1095 00:59:18,273 --> 00:59:20,950 là, một, tôi phải chèn số n, phải không? 1096 00:59:20,950 --> 00:59:22,765 Vì vậy, tôi đã biết rằng tôi sẽ có n lần lặp lại. 1097 00:59:22,765 --> 00:59:25,466 1098 00:59:25,466 --> 00:59:29,840 Nhưng đối với mỗi người trong số những con số, nếu tôi đã có nhìn vào tất cả các con số trong 1099 00:59:29,840 --> 00:59:34,380 danh sách được sắp xếp và đặt nó tất cả các cách ở phía trước, đó sẽ là n vuông 1100 00:59:34,380 --> 00:59:36,230 bởi vì nó sẽ là n lần n nữa. 1101 00:59:36,230 --> 00:59:38,280 Có ý nghĩa? 1102 00:59:38,280 --> 00:59:41,512 Những gì về omega? 1103 00:59:41,512 --> 00:59:42,886 >> TƯỢNG: [không nghe được]. 1104 00:59:42,886 --> 00:59:44,620 >> Lucas: Đó là trường hợp kịch bản tốt nhất. 1105 00:59:44,620 --> 00:59:48,810 Vì vậy, nó là như thế, trong rất nhiều lần cho phân loại, trường hợp kịch bản tốt nhất là 1106 00:59:48,810 --> 00:59:50,660 khi danh sách đã được sắp xếp. 1107 00:59:50,660 --> 00:59:52,670 Vì vậy, bạn không thực sự có để làm bất cứ điều gì. 1108 00:59:52,670 --> 00:59:56,290 Phân loại Bubble có sản phẩm tốt nhất trường hợp kịch bản của n. 1109 00:59:56,290 --> 00:59:58,820 Các bạn có biết tại sao? 1110 00:59:58,820 --> 01:00:00,620 >> TƯỢNG: [không nghe được]. 1111 01:00:00,620 --> 01:00:05,640 >> Lucas: Vâng, nếu bạn theo dõi cho dù dữ liệu khẩu phần có bất kỳ giao dịch hoán đổi hoặc 1112 01:00:05,640 --> 01:00:10,533 không, nếu bạn có một cái gì đó giống như thiết lập để thật sự nếu có một sự lặp lại, nếu 1113 01:00:10,533 --> 01:00:15,140 danh sách đã được sắp xếp, về cơ bản, những gì sẽ xảy ra là tôi sẽ 1114 01:00:15,140 --> 01:00:17,890 cố gắng để trao đổi mỗi hai các yếu tố xung quanh. 1115 01:00:17,890 --> 01:00:19,920 Tôi sẽ thấy rằng không có giao dịch hoán đổi. 1116 01:00:19,920 --> 01:00:21,230 Và tôi chỉ trả lại ngay lập tức. 1117 01:00:21,230 --> 01:00:24,240 >> Vì vậy, nó có nghĩa là tôi chỉ cần có để đi qua danh sách một lần. 1118 01:00:24,240 --> 01:00:28,990 Vì vậy, nó n vì tôi nhìn tại n phần tử. 1119 01:00:28,990 --> 01:00:30,930 Tại sao lựa chọn loại n vuông? 1120 01:00:30,930 --> 01:00:35,150 1121 01:00:35,150 --> 01:00:45,520 >> Vâng, ngay cả khi danh sách được sắp xếp, cho mỗi lần lặp lựa chọn sắp xếp, tôi 1122 01:00:45,520 --> 01:00:47,590 phải chọn các yếu tố tối thiểu. 1123 01:00:47,590 --> 01:00:49,980 Vì vậy, điều đó có nghĩa là tôi phải ra ngoài để tìm ở tất cả các yếu tố trong không được phân loại 1124 01:00:49,980 --> 01:00:53,350 liệt kê và tìm ra tối thiểu cho mỗi lần lặp. 1125 01:00:53,350 --> 01:00:54,600 Điều đó có ý nghĩa? 1126 01:00:54,600 --> 01:00:56,880 1127 01:00:56,880 --> 01:01:04,690 >> Và chèn thanh kiếm được n bởi vì trong trường hợp đó tôi đang cố gắng để chèn 1128 01:01:04,690 --> 01:01:09,320 số điện thoại và tất cả các con số, khi tôi cố gắng để chèn chúng, tôi thấy rằng họ 1129 01:01:09,320 --> 01:01:10,510 đang ở vị trí bên phải. 1130 01:01:10,510 --> 01:01:15,120 Tôi không cần phải đi kiểm tra tất cả các khác số trong danh sách được phân loại. 1131 01:01:15,120 --> 01:01:17,170 Vì vậy, đó là lý do tại sao nó sẽ được n. 1132 01:01:17,170 --> 01:01:19,480 Có ý nghĩa? 1133 01:01:19,480 --> 01:01:21,035 Và theta là gì? 1134 01:01:21,035 --> 01:01:23,410 >> TƯỢNG: [không nghe được]. 1135 01:01:23,410 --> 01:01:24,380 >> Lucas: gì, xin lỗi? 1136 01:01:24,380 --> 01:01:24,960 Nói lại lần nữa. 1137 01:01:24,960 --> 01:01:25,666 >> TƯỢNG: [không nghe được]. 1138 01:01:25,666 --> 01:01:26,490 >> Lucas: Chính xác. 1139 01:01:26,490 --> 01:01:31,280 Vì vậy, bạn có thể thấy rằng lựa chọn duy nhất lưu trữ trong Merge loại có thetas. 1140 01:01:31,280 --> 01:01:39,920 Và đó là bởi vì bạn chỉ có theta nếu cả hai Big O và Omega đều giống nhau. 1141 01:01:39,920 --> 01:01:41,520 OK. 1142 01:01:41,520 --> 01:01:44,210 Và cuối cùng, hợp nhất phân loại là trong nhật ký n. 1143 01:01:44,210 --> 01:01:48,910 >> Và sau đó, như Dan đã nói, Hợp nhất loại là loại giống như cùng một cách mà 1144 01:01:48,910 --> 01:01:50,320 bạn thực hiện tìm kiếm nhị phân. 1145 01:01:50,320 --> 01:01:53,530 Vì vậy, bạn sẽ có được danh sách. 1146 01:01:53,530 --> 01:01:55,170 Và bạn sẽ giảm đi một nửa. 1147 01:01:55,170 --> 01:02:00,580 Và sau đó bạn cắt chúng trong nửa nhỏ hơn. 1148 01:02:00,580 --> 01:02:01,730 Và sau đó bạn kết hợp chúng. 1149 01:02:01,730 --> 01:02:02,960 Các bạn hãy nhớ rằng, phải không? 1150 01:02:02,960 --> 01:02:04,960 OK, như ông đã nói. 1151 01:02:04,960 --> 01:02:08,330 >> OK, con trỏ. 1152 01:02:08,330 --> 01:02:11,078 Vì vậy, một con trỏ là gì? 1153 01:02:11,078 --> 01:02:12,050 >> TƯỢNG: [không nghe được]. 1154 01:02:12,050 --> 01:02:12,820 >> Lucas: Một địa chỉ. 1155 01:02:12,820 --> 01:02:13,720 OK. 1156 01:02:13,720 --> 01:02:18,530 Tôi biết rằng David cho thấy một loạt các video của Binky và những thứ chỉ 1157 01:02:18,530 --> 01:02:19,080 nhau. 1158 01:02:19,080 --> 01:02:22,960 Nhưng tôi thích nghĩ về con trỏ như chỉ đơn thuần là một địa chỉ. 1159 01:02:22,960 --> 01:02:26,110 Vì vậy, nó là một biến đang diễn ra để lưu trữ một địa chỉ. 1160 01:02:26,110 --> 01:02:31,940 >> Vì vậy, nó chỉ là biến đặc biệt này đó là dài bốn byte. 1161 01:02:31,940 --> 01:02:36,550 Nên nhớ rằng con trỏ đến bất cứ điều gì dài 32-bit của chúng tôi luôn luôn bốn byte 1162 01:02:36,550 --> 01:02:39,370 máy nên trường hợp thiết bị. 1163 01:02:39,370 --> 01:02:41,920 1164 01:02:41,920 --> 01:02:47,050 Và nó chỉ có vị trí của một biến bên trong của nó. 1165 01:02:47,050 --> 01:02:50,240 >> OK, do đó, bộ nhớ này, về cơ bản. 1166 01:02:50,240 --> 01:02:57,420 Vì vậy, mỗi khối bộ nhớ thực sự có một nhãn, đó là địa chỉ của 1167 01:02:57,420 --> 01:02:58,890 bộ nhớ slotty. 1168 01:02:58,890 --> 01:03:02,370 Vì vậy, đó có nghĩa là tôi có thể có một con trỏ trỏ tới 1169 01:03:02,370 --> 01:03:03,380 bất kỳ của các địa chỉ. 1170 01:03:03,380 --> 01:03:09,930 Vì vậy, lý do tại sao chúng tôi sẽ sử dụng con trỏ là nếu tôi phải nhớ vị trí 1171 01:03:09,930 --> 01:03:12,300 một biến cụ thể là một bộ nhớ. 1172 01:03:12,300 --> 01:03:16,560 >> Và các bạn hãy nhớ rằng một trong những trường hợp là nếu tôi có một chức năng 1173 01:03:16,560 --> 01:03:20,820 nếu tôi có thực sự muốn bạn hoán đổi cho số thực, tôi thực sự 1174 01:03:20,820 --> 01:03:22,110 phải gửi một con trỏ. 1175 01:03:22,110 --> 01:03:23,460 Không biến. 1176 01:03:23,460 --> 01:03:25,200 Các bạn có nhớ không? 1177 01:03:25,200 --> 01:03:26,450 Các between-- sự khác biệt 1178 01:03:26,450 --> 01:03:33,350 1179 01:03:33,350 --> 01:03:34,120 tên là gì? 1180 01:03:34,120 --> 01:03:36,010 Gọi giá trị và gọi tham khảo, phải không? 1181 01:03:36,010 --> 01:03:36,840 >> OK, yeah. 1182 01:03:36,840 --> 01:03:38,330 Vì vậy, gọi theo giá trị. 1183 01:03:38,330 --> 01:03:43,570 Khi bạn chỉ cần gửi một biến hoạt động bạn chỉ cần gửi một giá trị. 1184 01:03:43,570 --> 01:03:45,610 Vì vậy, bạn đang thực sự gửi một bản sao của biến. 1185 01:03:45,610 --> 01:03:49,720 Và chương trình của bạn không quan tâm về nếu cùng một biến thực sự 1186 01:03:49,720 --> 01:03:51,650 làm cho một bản sao. 1187 01:03:51,650 --> 01:03:56,330 >> Và kêu gọi bằng cách tham chiếu có nghĩa là Tôi thực sự gửi một bản sao của 1188 01:03:56,330 --> 01:03:57,550 con trỏ đến biến đó. 1189 01:03:57,550 --> 01:04:00,970 Vì vậy, nó có nghĩa là tôi đang gửi vị trí của biến đó. 1190 01:04:00,970 --> 01:04:04,440 Vì vậy, tôi đã cảm nhận được vị trí của biến, khi tôi gọi hàm 1191 01:04:04,440 --> 01:04:09,700 với con trỏ, tôi có thể thực sự thay đổi dữ liệu đó là trong chính. 1192 01:04:09,700 --> 01:04:12,050 Có ý nghĩa? 1193 01:04:12,050 --> 01:04:17,560 >> Mặc dù, con trỏ là một bản sao, con trỏ vẫn có địa chỉ thực sự của 1194 01:04:17,560 --> 01:04:20,090 biến mà tôi muốn thay đổi. 1195 01:04:20,090 --> 01:04:21,920 Có ý nghĩa? 1196 01:04:21,920 --> 01:04:24,290 >> Vì vậy, việc tạo ra con trỏ. 1197 01:04:24,290 --> 01:04:28,410 Hãy nhớ rằng, con trỏ luôn luôn có loại mà nó chỉ 1198 01:04:28,410 --> 01:04:29,890 để và sau đó một ngôi sao. 1199 01:04:29,890 --> 01:04:31,030 Và sau đó bạn đặt tên. 1200 01:04:31,030 --> 01:04:35,765 Vì vậy, hãy nhớ rằng bất cứ khi nào bạn có bất cứ điều gì sao, nó giống như một con trỏ đến 1201 01:04:35,765 --> 01:04:38,990 rằng bất cứ biến gõ mà bạn đã có. 1202 01:04:38,990 --> 01:04:42,850 >> Vì vậy, đây tại sao, ví dụ, đó là một con trỏ và một số nguyên. 1203 01:04:42,850 --> 01:04:47,680 Và sau đó char sao là một con trỏ sao char và vv. 1204 01:04:47,680 --> 01:04:47,960 Vâng? 1205 01:04:47,960 --> 01:04:52,710 >> TƯỢNG: Nếu chúng ta có một con trỏ đến n ngôi sao x. 1206 01:04:52,710 --> 01:04:55,255 Tôi biết rằng tạo ra một con trỏ đến x. 1207 01:04:55,255 --> 01:04:59,432 Liệu nó cũng khai báo x là một số nguyên? 1208 01:04:59,432 --> 01:05:05,170 >> Lucas: OK, vì vậy khi bạn nói sao x n, bạn không tạo ra một con trỏ đến một 1209 01:05:05,170 --> 01:05:06,000 biến x. 1210 01:05:06,000 --> 01:05:08,170 Bạn đang tạo ra một con trỏ tên x. 1211 01:05:08,170 --> 01:05:09,396 >> TƯỢNG: [không nghe được]. 1212 01:05:09,396 --> 01:05:14,250 >> Lucas: Vì vậy, khi tôi nói n x sao, tôi nói, hey, trong bộ nhớ, tôi sẽ 1213 01:05:14,250 --> 01:05:16,390 nhận được một trong ba hộp. 1214 01:05:16,390 --> 01:05:20,750 Và tôi sẽ nói rằng đó sẽ là x, đó là 1215 01:05:20,750 --> 01:05:22,000 sẽ là một con trỏ. 1216 01:05:22,000 --> 01:05:26,860 1217 01:05:26,860 --> 01:05:30,640 Và một điều thú vị về con trỏ là chúng ta nói rằng họ có 1218 01:05:30,640 --> 01:05:32,620 4 byte cho một máy tính 32-bit. 1219 01:05:32,620 --> 01:05:36,320 Và lý do cho điều đó là bởi vì 4 byte là 32-bit. 1220 01:05:36,320 --> 01:05:40,490 >> Và các máy tính 64 bit thực sự có địa chỉ con trỏ 1221 01:05:40,490 --> 01:05:43,480 có dài 64 bit. 1222 01:05:43,480 --> 01:05:49,820 Vì vậy, nó chỉ có nghĩa là kích thước của địa chỉ trong máy là khác nhau. 1223 01:05:49,820 --> 01:05:52,270 >> Vì vậy, Tham khảo và dereferencing. 1224 01:05:52,270 --> 01:05:54,310 Có hai nhà khai thác các bạn nên nhớ. 1225 01:05:54,310 --> 01:05:55,450 Đầu tiên là ký hiệu. 1226 01:05:55,450 --> 01:05:56,810 Thứ hai là ngôi sao. 1227 01:05:56,810 --> 01:06:05,060 Đừng nhầm lẫn bởi ngôi sao và điều này sao vì nhớ rằng, trong 1228 01:06:05,060 --> 01:06:06,950 trường hợp này, bạn có n sao. 1229 01:06:06,950 --> 01:06:08,700 >> Nó giống như một toàn bộ điều với nhau. 1230 01:06:08,700 --> 01:06:10,720 Không có sao n không gian. 1231 01:06:10,720 --> 01:06:12,070 Vì vậy, nó có nghĩa là nó là loại. 1232 01:06:12,070 --> 01:06:14,870 Nên nhớ rằng khi bạn có ngôi sao biến, bạn 1233 01:06:14,870 --> 01:06:16,230 nói về các loại. 1234 01:06:16,230 --> 01:06:20,540 >> Khi bạn chỉ có ngôi sao và sau đó tên của biến, nó có nghĩa là 1235 01:06:20,540 --> 01:06:24,100 bạn đang dereferencing con trỏ, mà có nghĩa là bạn đang nhìn vào 1236 01:06:24,100 --> 01:06:28,290 con trỏ, việc tìm kiếm địa chỉ đó là trỏ đến, đi đến địa chỉ đó, 1237 01:06:28,290 --> 01:06:30,850 và nhìn vào bất cứ khi nào bạn có ở đó. 1238 01:06:30,850 --> 01:06:34,310 Vì vậy, tôi nói với sinh viên của tôi rằng khi bạn có sao, bạn nên nghĩ rằng đó là 1239 01:06:34,310 --> 01:06:36,850 chữ viết tắt của nội dung. 1240 01:06:36,850 --> 01:06:39,770 >> Vì vậy, nếu bạn có một con trỏ và bạn làm sao con trỏ, đó là 1241 01:06:39,770 --> 01:06:41,720 nội dung của con trỏ. 1242 01:06:41,720 --> 01:06:44,580 Vì vậy, bạn đi đến bất cứ điều gì nó trỏ đến và xem xét các nội dung liên tục. 1243 01:06:44,580 --> 01:06:47,730 Và các ký hiệu tương tự điều như địa chỉ. 1244 01:06:47,730 --> 01:06:52,560 >> Vì vậy, nếu tôi có một biến a-- như thế, chúng ta hãy nói rằng tôi đã làm một int bằng 3-- 1245 01:06:52,560 --> 01:06:56,900 nếu tôi muốn tìm địa chỉ đó biến một bộ nhớ, tôi chỉ có thể làm 1246 01:06:56,900 --> 01:06:58,240 ký hiệu a. 1247 01:06:58,240 --> 01:07:00,280 Vì vậy, nó là địa chỉ của một. 1248 01:07:00,280 --> 01:07:01,530 Có ý nghĩa? 1249 01:07:01,530 --> 01:07:03,790 1250 01:07:03,790 --> 01:07:05,040 >> Vì vậy, đây là một ví dụ. 1251 01:07:05,040 --> 01:07:08,370 1252 01:07:08,370 --> 01:07:11,530 Đây là mất tích int b, int c. 1253 01:07:11,530 --> 01:07:16,520 Vì vậy, int một bằng 3 phương tiện Tôi sẽ đi vào bộ nhớ. 1254 01:07:16,520 --> 01:07:19,870 Và tôi sẽ tìm thấy một khe cắm và đưa số 3 ở đây. 1255 01:07:19,870 --> 01:07:22,200 >> Và sau đó int b bằng 4. 1256 01:07:22,200 --> 01:07:23,100 Tôi sẽ làm điều tương tự. 1257 01:07:23,100 --> 01:07:25,840 Tới bộ nhớ và đặt một số 4 trong một trong các hộp. 1258 01:07:25,840 --> 01:07:27,100 Và int bằng 5. 1259 01:07:27,100 --> 01:07:29,740 Tìm hộp khác và đặt một số 5. 1260 01:07:29,740 --> 01:07:36,160 >> Vì vậy, dòng này làm ra là gì? n sao pa bằng một ký hiệu. 1261 01:07:36,160 --> 01:07:37,800 Vì vậy, trước hết, n sao pa. 1262 01:07:37,800 --> 01:07:39,050 Là nó làm gì? 1263 01:07:39,050 --> 01:07:40,930 1264 01:07:40,930 --> 01:07:42,298 >> TƯỢNG: [không nghe được]. 1265 01:07:42,298 --> 01:07:47,890 >> Lucas: Vâng, vì vậy n sao pa, đầu tiên, khai báo một con trỏ được gọi là pa. 1266 01:07:47,890 --> 01:07:53,720 Và sau đó nó gán giá trị của con trỏ đó là địa chỉ của một. 1267 01:07:53,720 --> 01:07:55,790 Vì vậy, một ký hiệu. 1268 01:07:55,790 --> 01:07:58,510 Sau đó, nếu tôi làm sao pb, một pb sao là gì? 1269 01:07:58,510 --> 01:08:02,418 1270 01:08:02,418 --> 01:08:03,150 >> Ồ, xin lỗi. 1271 01:08:03,150 --> 01:08:06,330 Đây cũng là mất tích. n pb sao. 1272 01:08:06,330 --> 01:08:07,905 Ý tôi là sao máy tính. 1273 01:08:07,905 --> 01:08:11,200 Tôi rất xin lỗi. 1274 01:08:11,200 --> 01:08:11,940 Đó là điều tương tự. 1275 01:08:11,940 --> 01:08:16,408 Nhưng bây giờ tôi tốt ar tạo ra một con trỏ b và sau đó một con trỏ đến c. 1276 01:08:16,408 --> 01:08:16,886 Vâng? 1277 01:08:16,886 --> 01:08:18,136 >> TƯỢNG: [không nghe được]? 1278 01:08:18,136 --> 01:08:25,490 1279 01:08:25,490 --> 01:08:26,670 >> Lucas: Có. 1280 01:08:26,670 --> 01:08:32,630 Vì vậy, nếu bạn đi đến bộ nhớ và bạn đi đến hộp đó là vấn thiết kế cho pa, 1281 01:08:32,630 --> 01:08:37,149 bạn đang thực sự sẽ thấy một địa chỉ của một. 1282 01:08:37,149 --> 01:08:38,399 OK? 1283 01:08:38,399 --> 01:08:42,970 1284 01:08:42,970 --> 01:08:43,300 Vâng? 1285 01:08:43,300 --> 01:08:45,605 >> TƯỢNG: [không nghe được]? 1286 01:08:45,605 --> 01:08:49,260 >> Lucas: Vâng, con trỏ là một địa chỉ. 1287 01:08:49,260 --> 01:08:50,120 Không bao giờ quên điều đó. 1288 01:08:50,120 --> 01:08:52,800 Nó giống như là quan trọng nhất một phần về con trỏ. 1289 01:08:52,800 --> 01:08:56,180 Có lưu trữ và địa chỉ một số biến. 1290 01:08:56,180 --> 01:08:56,890 Bất cứ điều gì khác? 1291 01:08:56,890 --> 01:08:58,370 Bất kỳ câu hỏi nào khác không? 1292 01:08:58,370 --> 01:08:59,189 OK. 1293 01:08:59,189 --> 01:09:00,399 >> Vì vậy, Con trỏ và mảng. 1294 01:09:00,399 --> 01:09:08,189 Hãy nhớ rằng khi tôi làm int mảng 3, về cơ bản, tôi là, loại gì tôi đang làm là 1295 01:09:08,189 --> 01:09:12,779 của, tuyên bố trong một con trỏ. 1296 01:09:12,779 --> 01:09:18,960 Vì vậy, mảng là loại giống như một con trỏ đến một nơi cụ thể trong bộ nhớ trong mà tôi 1297 01:09:18,960 --> 01:09:21,999 phân bổ ba khe cắm cho các số nguyên. 1298 01:09:21,999 --> 01:09:23,430 Điều đó có ý nghĩa? 1299 01:09:23,430 --> 01:09:30,250 >> Vì vậy, khi tôi làm int mảng 3, những gì tôi làm, về cơ bản, được tạo ra ba 1300 01:09:30,250 --> 01:09:31,479 khe trong bộ nhớ. 1301 01:09:31,479 --> 01:09:33,899 Vì vậy, tôi chỉ tìm thấy ba khe trong bộ nhớ. 1302 01:09:33,899 --> 01:09:38,810 Vì vậy, nếu tôi làm, sau đó, một loạt ngôi sao, nó về cơ bản có nghĩa là nội dung của mảng, 1303 01:09:38,810 --> 01:09:46,180 có nghĩa là tôi xóa các con trỏ, tôi đi với nơi mà nó trỏ đến, 1304 01:09:46,180 --> 01:09:47,939 và tôi đặt một số. 1305 01:09:47,939 --> 01:09:53,729 >> Và sau đó, nếu tôi làm mảng sao cộng với 1, đó là điều tương tự như làm mảng 1306 01:09:53,729 --> 01:09:59,690 ngoặc đơn, mà chỉ có nghĩa là tôi đi đến nơi mà nó chỉ vào. 1307 01:09:59,690 --> 01:10:03,000 Và sau đó là làm cho cộng 1 tôi chuyển sang một vị trí. 1308 01:10:03,000 --> 01:10:06,510 Vì vậy, tôi đi đến vị trí này, trên thực tế, và đưa số hai. 1309 01:10:06,510 --> 01:10:10,900 >> Và sau đó, cuối cùng, khi tôi làm mảng cộng với 2, tôi đi đến nơi 1310 01:10:10,900 --> 01:10:11,825 trỏ mảng tại. 1311 01:10:11,825 --> 01:10:14,690 Và sau đó tôi chuyển sang các khối bộ nhớ. 1312 01:10:14,690 --> 01:10:16,240 Và sau đó tôi đưa số ba ở đây. 1313 01:10:16,240 --> 01:10:16,600 Vâng? 1314 01:10:16,600 --> 01:10:21,400 >> TƯỢNG: mảng Vì vậy, chỉ đơn giản là sao nói điểm đầu tiên. 1315 01:10:21,400 --> 01:10:25,090 Và bạn có thể thêm 1, chỉ vì chúng tôi chỉ thực sự 1316 01:10:25,090 --> 01:10:27,295 tham khảo địa chỉ đầu tiên. 1317 01:10:27,295 --> 01:10:28,545 >> Lucas: Vâng. 1318 01:10:28,545 --> 01:10:32,720 1319 01:10:32,720 --> 01:10:36,020 Tại sao chúng ta, ví dụ, nói mảng 0, 1 mảng và mảng 2? 1320 01:10:36,020 --> 01:10:38,970 1321 01:10:38,970 --> 01:10:42,790 Tôi nói, tại sao bạn làm 0, 1, 2, 3 thay vì 1, 2, 3? 1322 01:10:42,790 --> 01:10:46,550 Một trong những lý do là, một, máy tính lập trình thích để bắt đầu 1323 01:10:46,550 --> 01:10:47,750 kể từ 0. 1324 01:10:47,750 --> 01:10:52,370 Hai là bởi vì khi bạn làm mảng 0, đó là điều tương tự như làm mảng 1325 01:10:52,370 --> 01:10:56,330 cộng với 0, có nghĩa là tôi đi đến vị trí đó, và tôi không 1326 01:10:56,330 --> 01:10:59,320 bỏ qua bất kỳ các khối bộ nhớ. 1327 01:10:59,320 --> 01:11:01,750 Vì vậy, tôi không di chuyển bất kỳ khối bộ nhớ. 1328 01:11:01,750 --> 01:11:02,015 Vâng? 1329 01:11:02,015 --> 01:11:03,265 >> TƯỢNG: [không nghe được]? 1330 01:11:03,265 --> 01:11:05,928 1331 01:11:05,928 --> 01:11:12,670 >> Lucas: Vì vậy, cô ấy hỏi là gì sự khác biệt giữa làm 1332 01:11:12,670 --> 01:11:14,000 này hoặc làm malloc. 1333 01:11:14,000 --> 01:11:17,550 Một trong những sự khác biệt là int mảng 3 là tạo ra một 1334 01:11:17,550 --> 01:11:19,260 mảng trên stack. 1335 01:11:19,260 --> 01:11:23,080 Và khi tôi làm malloc, nó tạo ra trên heap. 1336 01:11:23,080 --> 01:11:25,250 Điều đó có ý nghĩa? 1337 01:11:25,250 --> 01:11:28,870 >> Vì vậy, làm thế nào để malloc thực sự làm việc? 1338 01:11:28,870 --> 01:11:32,245 Vì vậy, tại sao chúng ta thậm chí cần phải sử dụng malloc? 1339 01:11:32,245 --> 01:11:35,730 1340 01:11:35,730 --> 01:11:39,700 Loại trình biên dịch của con số ra tất cả các biến mà bạn đã khai báo. 1341 01:11:39,700 --> 01:11:44,040 Và ông đã tạo ra không gian cho tất cả của chúng trong ngăn xếp. 1342 01:11:44,040 --> 01:11:47,180 Vì vậy, tất cả các biến của bạn sẽ một nơi nào đó trong ngăn xếp. 1343 01:11:47,180 --> 01:11:49,460 Vì vậy, đây là biến môi trường. 1344 01:11:49,460 --> 01:11:53,850 >> Vì vậy, về cơ bản, không gian cho các biến trong bộ nhớ được phân bổ vào 1345 01:11:53,850 --> 01:11:55,080 thời gian biên dịch. 1346 01:11:55,080 --> 01:11:58,790 Vì vậy, nó có nghĩa là máy tính của bạn có biết tất cả những biến 1347 01:11:58,790 --> 01:11:59,790 trước. 1348 01:11:59,790 --> 01:12:02,500 Nó không cần biết giá trị bạn sẽ đặt trong đó. 1349 01:12:02,500 --> 01:12:05,490 Nhưng nó cần phải biết làm thế nào nhiêu bộ nhớ bạn cần. 1350 01:12:05,490 --> 01:12:09,380 >> Nhưng bây giờ chúng ta hãy nói rằng, ví dụ, bạn đang tạo ra một mảng hoặc tham gia một 1351 01:12:09,380 --> 01:12:13,430 chuỗi mà bạn đang dùng từ người sử dụng. 1352 01:12:13,430 --> 01:12:17,300 Bạn không biết làm thế nào dài chuỗi là có được, ví dụ. 1353 01:12:17,300 --> 01:12:20,600 Vì vậy, bạn không biết chính xác có bao nhiêu các khối bộ nhớ bạn phân bổ, phải không? 1354 01:12:20,600 --> 01:12:24,120 >> Vì vậy, nó không thực sự có ý nghĩa cho bạn nói đưa 100 ký tự. 1355 01:12:24,120 --> 01:12:26,420 Và sau đó những gì nếu người dùng viết 150? 1356 01:12:26,420 --> 01:12:27,670 Bạn sẽ được vặn. 1357 01:12:27,670 --> 01:12:30,160 1358 01:12:30,160 --> 01:12:34,620 >> Vì vậy, về cơ bản, bạn không thể chắc chắn như thế nào nhiêu bộ nhớ bạn cần phải phân bổ 1359 01:12:34,620 --> 01:12:35,960 khi bạn biên dịch chương trình. 1360 01:12:35,960 --> 01:12:38,240 Bạn chỉ cần biết rằng vào thời gian chạy. 1361 01:12:38,240 --> 01:12:39,950 Vì vậy, đó là lý do tại sao bạn có đống. 1362 01:12:39,950 --> 01:12:47,610 Vì vậy, các đống sẽ có bộ nhớ rằng bạn đang phân bổ trong 1363 01:12:47,610 --> 01:12:50,810 thời gian của chương trình đang chạy. 1364 01:12:50,810 --> 01:12:55,780 >> Vì vậy, về cơ bản, khi bạn làm malloc, những gì bạn đang làm là phân bổ bộ nhớ 1365 01:12:55,780 --> 01:13:00,160 thời gian chạy, có nghĩa là bạn quyết định ngay tại thời điểm đó mà bạn 1366 01:13:00,160 --> 01:13:02,670 nên có bộ nhớ đó. 1367 01:13:02,670 --> 01:13:04,210 Vì vậy, đó là khi bạn đang phân bổ nó. 1368 01:13:04,210 --> 01:13:06,430 Điều đó có ý nghĩa? 1369 01:13:06,430 --> 01:13:11,690 >> Vì vậy, hãy nhớ rằng, chồng có biến được tạo ra vào thời gian biên dịch. 1370 01:13:11,690 --> 01:13:14,560 Và sau đó các đống có biến được tạo ra khi bạn đi 1371 01:13:14,560 --> 01:13:15,600 với malloc, ví dụ. 1372 01:13:15,600 --> 01:13:16,850 >> TƯỢNG: [không nghe được]? 1373 01:13:16,850 --> 01:13:19,179 1374 01:13:19,179 --> 01:13:24,340 >> Lucas: Vậy là GetString sẽ gọi malloc. 1375 01:13:24,340 --> 01:13:26,710 Hãy để tôi nói về malloc, và Tôi sẽ giải thích GetString. 1376 01:13:26,710 --> 01:13:32,000 Vì vậy, malloc là điều tương tự như cấp phát bộ nhớ. 1377 01:13:32,000 --> 01:13:34,600 Vì vậy, nó sẽ phân bổ bộ nhớ trên heap. 1378 01:13:34,600 --> 01:13:40,010 Và nó sẽ trả về một con trỏ đến nơi mà bộ nhớ được phân chia. 1379 01:13:40,010 --> 01:13:43,090 >> Vì vậy, khi bạn do-- 1380 01:13:43,090 --> 01:13:44,910 đây để example-- 1381 01:13:44,910 --> 01:13:45,830 n con trỏ sao. 1382 01:13:45,830 --> 01:13:50,520 Và sau đó con trỏ bằng malloc kích thước của 10 inch lần. 1383 01:13:50,520 --> 01:13:52,110 Tôi là tạo ra một con trỏ. 1384 01:13:52,110 --> 01:13:59,020 Và sau đó tôi chỉ định rằng con trỏ đến giá trị của con trỏ mà malloc 1385 01:13:59,020 --> 01:13:59,680 đem lại cho tôi. 1386 01:13:59,680 --> 01:14:04,150 >> Vì vậy, tôi yêu cầu malloc bạn có thể phân bổ không gian cho 10 số nguyên. 1387 01:14:04,150 --> 01:14:05,390 Đó là những gì nó nói. 1388 01:14:05,390 --> 01:14:09,020 Và malloc mang lại cho tôi trở lại một con trỏ đến nơi đó. 1389 01:14:09,020 --> 01:14:11,460 Có ý nghĩa? 1390 01:14:11,460 --> 01:14:12,270 OK. 1391 01:14:12,270 --> 01:14:17,940 Và tôi GetString được, về cơ bản, làm một gọi đến malloc để bạn có thể phân bổ 1392 01:14:17,940 --> 01:14:21,680 bộ nhớ trong thời gian chạy. 1393 01:14:21,680 --> 01:14:26,460 >> Luôn luôn nhớ để kiểm tra null vì malloc sẽ trả về null 1394 01:14:26,460 --> 01:14:28,200 nếu nó không thể cấp phát bộ nhớ. 1395 01:14:28,200 --> 01:14:31,660 Hãy nói rằng bạn yêu cầu vô lý số lượng bộ nhớ. 1396 01:14:31,660 --> 01:14:33,950 Máy tính của bạn không phải là có được có thể phân bổ nhiều. 1397 01:14:33,950 --> 01:14:36,410 >> Vì vậy, malloc là chỉ cần đi để trả về null. 1398 01:14:36,410 --> 01:14:42,210 Vì vậy, luôn luôn ghi nhớ để kiểm tra xem con trỏ mà bạn nhận được từ malloc 1399 01:14:42,210 --> 01:14:45,640 null hay không bởi vì, nếu có, có lẽ bạn được dereferencing một con trỏ và 1400 01:14:45,640 --> 01:14:48,340 gây ra lỗi bên. 1401 01:14:48,340 --> 01:14:50,930 Và cuối cùng, đừng quên bộ nhớ của bạn. 1402 01:14:50,930 --> 01:14:57,800 1403 01:14:57,800 --> 01:15:00,560 >> Malloc được tạo ra bộ nhớ trong heap. 1404 01:15:00,560 --> 01:15:03,436 Và bạn phải giải phóng bộ nhớ trước khi chương trình kết thúc. 1405 01:15:03,436 --> 01:15:05,370 OK, đó là tất cả đối với tôi. 1406 01:15:05,370 --> 01:15:07,900 Xin lỗi, Rob. 1407 01:15:07,900 --> 01:15:07,950 Cảm ơn. 1408 01:15:07,950 --> 01:15:09,878 >> [Vỗ tay] 1409 01:15:09,878 --> 01:15:12,679 >> Lucas: Bất kỳ câu hỏi cuối cùng trước khi Rob đến? 1410 01:15:12,679 --> 01:15:13,138 Không có? 1411 01:15:13,138 --> 01:15:13,597 Vâng? 1412 01:15:13,597 --> 01:15:15,892 >> TƯỢNG: Tôi không thấy này một trực tuyến. 1413 01:15:15,892 --> 01:15:17,269 Bạn đã tải lên nó chưa? 1414 01:15:17,269 --> 01:15:19,106 >> Lucas: Tôi nghĩ là Dave tải lên nó sớm. 1415 01:15:19,106 --> 01:15:19,880 >> DAVE: Nó sẽ được đăng. 1416 01:15:19,880 --> 01:15:20,310 >> Lucas: Nó sẽ được trực tuyến. 1417 01:15:20,310 --> 01:15:21,175 >> TƯỢNG: Đó là lên. 1418 01:15:21,175 --> 01:15:22,090 >> Lucas: Đó là lên? 1419 01:15:22,090 --> 01:15:23,157 OK. 1420 01:15:23,157 --> 01:15:23,644 Vâng? 1421 01:15:23,644 --> 01:15:27,053 >> TƯỢNG: [không nghe được]? 1422 01:15:27,053 --> 01:15:30,285 >> Lucas: Có, bạn nên thoát tất cả các bộ nhớ được đặt trong heap. 1423 01:15:30,285 --> 01:15:31,535 >> TƯỢNG: [không nghe được]? 1424 01:15:31,535 --> 01:15:34,518 1425 01:15:34,518 --> 01:15:36,160 >> Lucas: Có. 1426 01:15:36,160 --> 01:15:39,980 Bất cứ lúc nào bạn có một malloc văn hóa, bạn cần phải có một nền văn hóa miễn phí 1427 01:15:39,980 --> 01:15:42,640 sau khi bạn ngừng sử dụng biến đó. 1428 01:15:42,640 --> 01:15:44,800 Vì vậy, malloc và miễn phí là luôn bên nhau. 1429 01:15:44,800 --> 01:15:45,410 Người bạn tốt nhất của họ. 1430 01:15:45,410 --> 01:15:46,720 Yeah. 1431 01:15:46,720 --> 01:15:47,970 Rob? 1432 01:15:47,970 --> 01:15:55,595 1433 01:15:55,595 --> 01:15:56,850 >> ROB: Tôi sẽ đi một cách nhanh chóng. 1434 01:15:56,850 --> 01:16:00,466 Và cũng là video sẽ được đưa lên. 1435 01:16:00,466 --> 01:16:01,716 Tôi có mic trên. 1436 01:16:01,716 --> 01:16:24,060 1437 01:16:24,060 --> 01:16:26,230 >> OK, vì vậy tuần thứ năm. 1438 01:16:26,230 --> 01:16:27,970 Điều đầu tiên chúng ta có là chồng. 1439 01:16:27,970 --> 01:16:33,390 Vì vậy, hãy nhớ rằng chỉ có một chồng khung cho mỗi cuộc gọi chức năng hoạt động. 1440 01:16:33,390 --> 01:16:34,710 Chúng ta sẽ thấy rằng trong một giây. 1441 01:16:34,710 --> 01:16:37,850 Và cũng có thể nhớ những gì thực sự đi trong mỗi khung ngăn xếp sẽ được 1442 01:16:37,850 --> 01:16:41,880 các biến địa phương của các chức năng của chúng tôi, các đối số được truyền vào chúng tôi 1443 01:16:41,880 --> 01:16:43,880 chức năng, cùng với một vài những thứ khác bạn không thực sự 1444 01:16:43,880 --> 01:16:45,260 cần phải lo lắng. 1445 01:16:45,260 --> 01:16:50,950 >> Vì vậy, đây là một chương trình ví dụ ở đâu, thông báo, chính là sự trở lại printfing 1446 01:16:50,950 --> 01:16:52,830 giá trị của foo 4. 1447 01:16:52,830 --> 01:16:57,930 foo là chỉ cần đi để trả lại giá trị của thanh 4 dấu phẩy 6. 1448 01:16:57,930 --> 01:17:02,380 Và thanh sẽ thiết lập một số địa phương n biến bằng 4 lần 6. 1449 01:17:02,380 --> 01:17:03,920 Và sau đó trở về n. 1450 01:17:03,920 --> 01:17:09,130 >> Vì vậy, chúng ta hãy nhìn vào ngăn xếp trong suốt lặp đi lặp lại thực tế của chương trình này. 1451 01:17:09,130 --> 01:17:10,500 Vì vậy, có dưới cùng của ngăn xếp của chúng tôi. 1452 01:17:10,500 --> 01:17:12,620 Hãy nhớ rằng chồng lớn lên. 1453 01:17:12,620 --> 01:17:15,370 Vì vậy, ở dưới cùng của ngăn xếp của chúng tôi, chúng tôi có một khung stack cho chính. 1454 01:17:15,370 --> 01:17:17,000 Khi chương trình bắt đầu, chính luôn luôn là sẽ có mặt tại 1455 01:17:17,000 --> 01:17:18,560 dưới cùng của ngăn xếp của chúng tôi. 1456 01:17:18,560 --> 01:17:20,880 >> Và những gì là bên trong của chúng tôi ngăn xếp khung cho chính? 1457 01:17:20,880 --> 01:17:23,810 Vì vậy, mặc dù không có địa phương biến chính, như tôi đã nói trước đây, 1458 01:17:23,810 --> 01:17:29,670 chúng tôi đã argc và RGV chiếm không gian bên trong của chính stack frame. 1459 01:17:29,670 --> 01:17:33,260 Vì vậy, chính hiện nay sẽ gọi hàm foo. 1460 01:17:33,260 --> 01:17:35,125 Và điều đó có nghĩa là foo sẽ có stack frame riêng của mình. 1461 01:17:35,125 --> 01:17:36,970 >> Vì vậy, bây giờ chúng tôi đang ở trong các foo chức năng. 1462 01:17:36,970 --> 01:17:38,610 Và những gì cần phải đi stack frame foo không? 1463 01:17:38,610 --> 01:17:41,100 Vâng, foo có một đối số n. 1464 01:17:41,100 --> 01:17:45,440 Và n bằng 4 vì đó là những gì chính là đi qua như là đối số của foo. 1465 01:17:45,440 --> 01:17:48,490 >> Vì vậy, bây giờ foo sẽ gọi thanh. 1466 01:17:48,490 --> 01:17:52,070 Thanh là những gì sẽ có trong của 'stack frame của nó? 1467 01:17:52,070 --> 01:17:55,610 Nó có x bằng 4 y bằng sáu. 1468 01:17:55,610 --> 01:17:58,540 Đó không phải là tất cả những gì chúng ta sẽ có trong khung ngăn xếp vì thanh 1469 01:17:58,540 --> 01:18:00,580 cũng có một biến n địa phương. 1470 01:18:00,580 --> 01:18:03,370 Và n chúng ta sẽ thiết lập bằng 24. 1471 01:18:03,370 --> 01:18:05,750 >> Vì vậy, bây giờ thanh sẽ trở lại n. 1472 01:18:05,750 --> 01:18:09,300 Vì vậy, thanh đang trở lại từ 24 đến ngăn xếp khung foo. 1473 01:18:09,300 --> 01:18:12,560 Và bởi vì thanh bây giờ quay trở lại, mà có nghĩa là chúng ta đang xuất hiện các khung stack 1474 01:18:12,560 --> 01:18:14,250 cho thanh tắt của chồng. 1475 01:18:14,250 --> 01:18:18,430 Vì vậy, tất cả các bộ nhớ mà thanh đã sử dụng hiện nay là ra khỏi ngăn xếp. 1476 01:18:18,430 --> 01:18:21,550 >> Bây giờ, foo cũng sẽ trở lại từ 24 đến chính. 1477 01:18:21,550 --> 01:18:25,470 Vì vậy, bây giờ foo được trở về, bộ nhớ foo đã được sử dụng trong 'của nó 1478 01:18:25,470 --> 01:18:27,550 stack frame cũng đã biến mất. 1479 01:18:27,550 --> 01:18:29,660 Và bây giờ, chính là sẽ gọi printf. 1480 01:18:29,660 --> 01:18:31,660 Vì vậy, printf chỉ là một chức năng. 1481 01:18:31,660 --> 01:18:35,320 Khi chúng tôi gọi printf, nó sẽ được một khung stack cho printf 1482 01:18:35,320 --> 01:18:36,470 chức năng gọi. 1483 01:18:36,470 --> 01:18:37,990 >> Chúng ta đang đi qua printf? 1484 01:18:37,990 --> 01:18:40,090 Đó là những gì đang xảy ra đi trên khung ngăn xếp của nó. 1485 01:18:40,090 --> 01:18:44,970 Ít nhất, chúng tôi đang đi qua rằng phần trăm i n và dấu gạch chéo ngược 1486 01:18:44,970 --> 01:18:47,180 đối số 24. 1487 01:18:47,180 --> 01:18:50,370 Nó có thể có nhiều trong đó là stack frame nếu printf xảy ra để được sử dụng một số 1488 01:18:50,370 --> 01:18:51,200 biến địa phương. 1489 01:18:51,200 --> 01:18:51,920 Chúng tôi không biết. 1490 01:18:51,920 --> 01:18:53,810 >> Nhưng tất cả những gì đi vào của printf ngăn xếp khung. 1491 01:18:53,810 --> 01:18:55,740 Nó sẽ thực hiện printf. 1492 01:18:55,740 --> 01:18:56,830 Sau đó printf được thực hiện. 1493 01:18:56,830 --> 01:18:57,820 Nó sẽ trở lại. 1494 01:18:57,820 --> 01:18:58,960 Cuối cùng, chính được thực hiện. 1495 01:18:58,960 --> 01:18:59,860 Chính sẽ trở lại. 1496 01:18:59,860 --> 01:19:02,020 Và sau đó chương trình của chúng tôi được thực hiện. 1497 01:19:02,020 --> 01:19:02,480 Vâng? 1498 01:19:02,480 --> 01:19:04,505 >> TƯỢNG: Bạn có nhìn thấy [không nghe được] 1499 01:19:04,505 --> 01:19:05,900 lập luận [không nghe được] 1500 01:19:05,900 --> 01:19:06,830 các thông số? 1501 01:19:06,830 --> 01:19:09,970 >> ROB: Như vậy, có một sự khác biệt tinh tế giữa lý luận và các thông số. 1502 01:19:09,970 --> 01:19:14,400 Và thực sự, trong nói chuyện thông thường, mọi người có xu hướng chỉ cần trộn chúng lên tất cả các thời gian. 1503 01:19:14,400 --> 01:19:17,550 Tuy nhiên, các thông số là chính thức tên các sự vật. 1504 01:19:17,550 --> 01:19:20,180 >> Vì vậy, argc và argv là tham số cho chính. 1505 01:19:20,180 --> 01:19:23,440 Đối số là những gì bạn thực sự vượt qua trong khi các thông số. 1506 01:19:23,440 --> 01:19:28,340 Vì vậy, khi tôi gọi foo 4, 4 là tham số tôi đi qua trong. 1507 01:19:28,340 --> 01:19:31,460 Và tham số n, bên trong foo, mang giá trị 4 1508 01:19:31,460 --> 01:19:32,880 kể từ 4 là lập luận. 1509 01:19:32,880 --> 01:19:35,826 >> TƯỢNG: [không nghe được]? 1510 01:19:35,826 --> 01:19:37,880 >> ROB: n là một biến địa phương để thanh. 1511 01:19:37,880 --> 01:19:41,420 1512 01:19:41,420 --> 01:19:44,960 n vẫn còn địa phương để foo, nhưng đó là một tham số foo. 1513 01:19:44,960 --> 01:19:48,190 Nó không phải là một biến địa phương. 1514 01:19:48,190 --> 01:19:48,546 Vâng? 1515 01:19:48,546 --> 01:19:51,180 >> TƯỢNG: [không nghe được]? 1516 01:19:51,180 --> 01:19:55,400 >> ROB: foo chỉ được gọi thanh và trở về bất cứ điều gì trở lại quán bar. 1517 01:19:55,400 --> 01:19:56,786 >> TƯỢNG: [không nghe được]? 1518 01:19:56,786 --> 01:19:59,591 >> ROB: Vâng, chỉ để xem nhiều ngăn xếp khung. 1519 01:19:59,591 --> 01:20:00,082 Vâng? 1520 01:20:00,082 --> 01:20:03,519 >> TƯỢNG: Tại sao foo được gọi là trước khi printf? 1521 01:20:03,519 --> 01:20:05,920 >> ROB: Tại sao gọi là foo trước khi printf? 1522 01:20:05,920 --> 01:20:10,740 Vì vậy, tôi có thể có, thay vào đó, làm điều gì đó như int x bằng foo của 4 1523 01:20:10,740 --> 01:20:12,980 và sau đó in x. 1524 01:20:12,980 --> 01:20:17,900 Nhưng thay vào đó, tôi kết hợp các chức năng gọi vào đối số printf. 1525 01:20:17,900 --> 01:20:23,670 >> Nhưng chú ý rằng chúng tôi có thể không thực sự thực hiện các cuộc gọi đến printf đến khi chúng tôi 1526 01:20:23,670 --> 01:20:25,610 tìm ra những gì là foo 4. 1527 01:20:25,610 --> 01:20:27,480 Vì vậy, chúng ta sẽ đánh giá này. 1528 01:20:27,480 --> 01:20:32,504 Và chỉ một lần thực hiện xong sẽ trở lại và đánh giá này. 1529 01:20:32,504 --> 01:20:32,990 Vâng? 1530 01:20:32,990 --> 01:20:37,364 >> TƯỢNG: Bởi vì cả hai thanh [không nghe được] 1531 01:20:37,364 --> 01:20:41,738 giá trị, tại sao chúng ta không có [không nghe được]? 1532 01:20:41,738 --> 01:20:44,400 >> ROB: Họ hoàn toàn phải là int. 1533 01:20:44,400 --> 01:20:46,260 Đó không phải là bắt hơn nhiều đường. 1534 01:20:46,260 --> 01:20:49,010 Vì vậy, nó phải được thanh int và int foo kể từ khi cả hai của những 1535 01:20:49,010 --> 01:20:50,460 đang quay trở lại các số nguyên. 1536 01:20:50,460 --> 01:20:54,214 Void duy nhất là nếu họ sẽ không để trở về giá trị thực tế. 1537 01:20:54,214 --> 01:20:54,692 Vâng? 1538 01:20:54,692 --> 01:20:58,038 >> TƯỢNG: Nếu bạn đã có một dòng trên sự trở lại, [không nghe được]? 1539 01:20:58,038 --> 01:21:01,862 1540 01:21:01,862 --> 01:21:03,730 >> ROB: Một dòng trên sự trở lại? 1541 01:21:03,730 --> 01:21:04,410 >> TƯỢNG: Vâng. 1542 01:21:04,410 --> 01:21:10,780 Cũng giống như nếu bạn đã làm printf và [không nghe được], nó sẽ in hai lần? 1543 01:21:10,780 --> 01:21:12,992 >> ROB: Vì vậy, bên trong foo? 1544 01:21:12,992 --> 01:21:15,945 Nếu chúng ta có một printf ngay tại đây? 1545 01:21:15,945 --> 01:21:16,750 >> TƯỢNG: Vâng. 1546 01:21:16,750 --> 01:21:19,510 >> ROB: Vì vậy, nếu chúng ta có quyền printf ở đây, nó sẽ in một lần. 1547 01:21:19,510 --> 01:21:23,400 Vì chúng ta đang gọi foo một lần ngay ở đây, sau đó chúng tôi sẽ nhấn printf. 1548 01:21:23,400 --> 01:21:24,620 Sau đó, chúng ta sẽ gọi thanh. 1549 01:21:24,620 --> 01:21:25,710 Và sau đó foo sẽ trở lại. 1550 01:21:25,710 --> 01:21:26,275 Và đó là nó. 1551 01:21:26,275 --> 01:21:30,985 Chúng tôi chỉ có bao giờ gặp phải printf một lần. 1552 01:21:30,985 --> 01:21:31,482 Vâng? 1553 01:21:31,482 --> 01:21:32,973 >> TƯỢNG: [không nghe được] 1554 01:21:32,973 --> 01:21:37,950 printf gọi foo bởi vì chúng tôi đầu tiên gọi printf và sau đó chúng tôi đang đi qua 1555 01:21:37,950 --> 01:21:38,580 các đối số. 1556 01:21:38,580 --> 01:21:40,960 >> ROB: Vì vậy, về mặt lý thuyết, không phải là printf gọi foo? 1557 01:21:40,960 --> 01:21:42,220 Vì vậy, không có. 1558 01:21:42,220 --> 01:21:47,360 Chỉ cần theo thứ tự mà c sẽ thực hiện những điều này là, trước khi chúng ta có thể 1559 01:21:47,360 --> 01:21:49,800 gọi một chức năng, tất cả các đối số với chức năng phải 1560 01:21:49,800 --> 01:21:51,600 được đánh giá hoàn toàn. 1561 01:21:51,600 --> 01:21:53,540 Vì vậy, điều này hoàn toàn được đánh giá? 1562 01:21:53,540 --> 01:21:54,610 Vâng, nó chỉ là một chuỗi. 1563 01:21:54,610 --> 01:21:55,480 Nó chỉ là một giá trị. 1564 01:21:55,480 --> 01:21:57,200 >> Sau đó, chúng ta phải hoàn toàn đánh giá này. 1565 01:21:57,200 --> 01:21:59,720 Một khi điều này được thực hiện, bây giờ tất cả đối số của nó được đánh giá. 1566 01:21:59,720 --> 01:22:01,982 Và bây giờ chúng tôi có thể làm cho gọi printf. 1567 01:22:01,982 --> 01:22:02,478 Vâng? 1568 01:22:02,478 --> 01:22:03,966 >> TƯỢNG: Một câu hỏi. 1569 01:22:03,966 --> 01:22:06,942 Nếu bạn có một chức năng vô hiệu, phải bạn có dấu chấm phẩy trở lại? 1570 01:22:06,942 --> 01:22:09,910 >> ROB: Bạn làm không phải là một dấu chấm phẩy trở lại nếu bạn có một chức năng vô hiệu. 1571 01:22:09,910 --> 01:22:13,370 1572 01:22:13,370 --> 01:22:14,780 OK. 1573 01:22:14,780 --> 01:22:15,830 Vì vậy, tại một số công cụ đống. 1574 01:22:15,830 --> 01:22:19,640 Vì vậy, đống là làm thế nào chúng ta sẽ đối phó với quản lý bộ nhớ động. 1575 01:22:19,640 --> 01:22:23,100 Và điều này trực tiếp trái ngược với ngăn xếp mà chúng ta gọi là tự động 1576 01:22:23,100 --> 01:22:24,100 quản lý bộ nhớ. 1577 01:22:24,100 --> 01:22:27,140 >> Vì vậy, trên stack, bạn không bao giờ thực sự có làm thế nào để đối phó với các biến địa phương 1578 01:22:27,140 --> 01:22:30,400 đang bị đẩy và bật tắt tất cả các khung stack và tất cả những thứ đó. 1579 01:22:30,400 --> 01:22:31,070 Bạn không cần phải lo lắng về nó. 1580 01:22:31,070 --> 01:22:32,070 Nó tự động. 1581 01:22:32,070 --> 01:22:36,990 Vì vậy, các đống là thủ công. 1582 01:22:36,990 --> 01:22:38,070 Và [không nghe được] 1583 01:22:38,070 --> 01:22:41,260 xuất phát từ các chức năng này malloc và miễn phí. 1584 01:22:41,260 --> 01:22:43,550 >> Vì vậy, đây là một chương trình khác. 1585 01:22:43,550 --> 01:22:47,145 Tất cả chúng ta đang làm là mallocing một số nguyên. 1586 01:22:47,145 --> 01:22:49,360 Chúng tôi đang lưu trữ nó trong sao x. 1587 01:22:49,360 --> 01:22:52,520 Tất nhiên, chúng ta phải kiểm tra để xem nếu x là null. 1588 01:22:52,520 --> 01:22:56,400 Sau đó, chúng ta sẽ chỉ cần thiết lập gì x được trỏ đến đến 50. 1589 01:22:56,400 --> 01:23:00,350 1590 01:23:00,350 --> 01:23:03,260 In những gì x được trỏ đến, in x, và sau đó miễn phí x. 1591 01:23:03,260 --> 01:23:08,920 >> Vì vậy, làm thế nào là thực sự sẽ xem xét nếu chúng ta nhìn vào stack và heap của chúng tôi? 1592 01:23:08,920 --> 01:23:10,950 Vì vậy, chúng tôi sẽ bắt đầu lại. 1593 01:23:10,950 --> 01:23:12,580 Dưới cùng của ngăn xếp của chúng tôi như trước. 1594 01:23:12,580 --> 01:23:15,930 Hãy nhớ rằng ngươi đống trực tiếp phản đối việc chồng? 1595 01:23:15,930 --> 01:23:18,850 Vì vậy, chúng ta sẽ có đầu đống của chúng tôi ở đó. 1596 01:23:18,850 --> 01:23:22,590 >> Vì vậy, dưới cùng của ngăn xếp của chúng tôi, chúng tôi có stack frame của chúng tôi cho chính. 1597 01:23:22,590 --> 01:23:28,000 Nó có không gian cho argc, argv, và chúng tôi bây giờ có một biến địa phương x, 1598 01:23:28,000 --> 01:23:30,030 là một ngôi sao int. 1599 01:23:30,030 --> 01:23:32,240 Vì vậy, chúng ta sẽ lặp thông qua chương trình này. 1600 01:23:32,240 --> 01:23:34,420 Điều đầu tiên chúng ta có là một cuộc gọi đến malloc. 1601 01:23:34,420 --> 01:23:36,250 >> Vì vậy, chúng tôi đang thực hiện một cuộc gọi đến malloc. 1602 01:23:36,250 --> 01:23:37,100 Malloc là một chức năng. 1603 01:23:37,100 --> 01:23:38,770 Nó sẽ có được một khung stack. 1604 01:23:38,770 --> 01:23:40,180 Chúng ta đang đi qua để malloc? 1605 01:23:40,180 --> 01:23:41,610 Điều đó sẽ đi vào bên trong của khung stack. 1606 01:23:41,610 --> 01:23:45,130 Chúng tôi đang đi qua kích thước của n, mà là 4. 1607 01:23:45,130 --> 01:23:49,700 Vì vậy, đó là thông qua malloc. 1608 01:23:49,700 --> 01:23:50,910 >> Không malloc làm gì? 1609 01:23:50,910 --> 01:23:53,820 Nó lấy chúng tôi một số không gian trên heap. 1610 01:23:53,820 --> 01:23:55,320 Vì vậy, chúng ta sẽ đi đến đống. 1611 01:23:55,320 --> 01:23:57,990 Và chúng ta sẽ lấy 4 byte từ đống. 1612 01:23:57,990 --> 01:24:01,500 Vì vậy, chúng ta hãy chỉ cho rằng một địa chỉ tùy ý. 1613 01:24:01,500 --> 01:24:06,680 0x123 Chỉ cần giả vờ đó là một địa chỉ đó là trên heap. 1614 01:24:06,680 --> 01:24:12,300 >> Vì vậy, những gì thực sự là bên trong đó khu vực bộ nhớ tại địa chỉ Ox123? 1615 01:24:12,300 --> 01:24:13,080 Rác thải. 1616 01:24:13,080 --> 01:24:15,270 Vì vậy, chúng tôi đã không lưu trữ bất cứ điều gì trong đó. 1617 01:24:15,270 --> 01:24:18,830 Vì vậy, theo chúng tôi được biết, nó có thể là bất cứ điều gì. 1618 01:24:18,830 --> 01:24:20,560 Bạn không nên cho rằng đó là số không. 1619 01:24:20,560 --> 01:24:23,870 Đó là không có khả năng không nhất. 1620 01:24:23,870 --> 01:24:26,260 >> Lợi nhuận vì vậy bây giờ malloc. 1621 01:24:26,260 --> 01:24:28,020 Và chúng ta làm gì khi malloc lợi nhuận? 1622 01:24:28,020 --> 01:24:29,800 Chúng tôi thiết lập những gì nó trở về. 1623 01:24:29,800 --> 01:24:32,290 Chúng tôi thiết lập x bằng gì nó đang trở lại. 1624 01:24:32,290 --> 01:24:33,690 Vì vậy, những gì là nó trở về? 1625 01:24:33,690 --> 01:24:38,150 Nó trở về 0x123 vì đó là địa chỉ của khối bộ nhớ rằng nó 1626 01:24:38,150 --> 01:24:40,850 chỉ phân bổ trong đống. 1627 01:24:40,850 --> 01:24:47,160 >> Vì vậy, trở lại 0x123 x bây giờ sẽ được thiết lập bằng 0x123 đó, những bức tranh, 1628 01:24:47,160 --> 01:24:52,940 chúng tôi thường xuyên vẽ như x có một thực tế mũi tên chỉ vào khối đó. 1629 01:24:52,940 --> 01:24:55,820 Nhưng x chỉ được lưu trữ địa chỉ đó. 1630 01:24:55,820 --> 01:24:58,670 Vì vậy, bây giờ chúng tôi phải kiểm tra xem x là null. 1631 01:24:58,670 --> 01:24:59,120 Đó không phải là null. 1632 01:24:59,120 --> 01:25:02,170 Chúng tôi giả vờ rằng malloc đó đã thành công. 1633 01:25:02,170 --> 01:25:04,950 >> Vì vậy, tại sao x bằng 50. 1634 01:25:04,950 --> 01:25:08,450 Vì vậy, nó có nghĩa là sao nhớ đi đến địa chỉ đó. 1635 01:25:08,450 --> 01:25:12,700 Vì vậy, 0x123 Chúng ta sẽ đi đến địa chỉ đó. 1636 01:25:12,700 --> 01:25:14,660 Vì vậy, đưa chúng ta lên đó. 1637 01:25:14,660 --> 01:25:16,310 Chúng tôi đang làm gì tại địa chỉ đó? 1638 01:25:16,310 --> 01:25:19,020 Chúng tôi đang lưu trữ 50. 1639 01:25:19,020 --> 01:25:22,500 >> Vì vậy, sau khi dòng này, đó là những gì mọi thứ sẽ như thế nào. 1640 01:25:22,500 --> 01:25:24,640 Vì vậy, bây giờ nó không còn rác trên đó. 1641 01:25:24,640 --> 01:25:28,910 Bây giờ chúng ta biết rằng 50 là ở chỗ địa chỉ cụ thể vì 1642 01:25:28,910 --> 01:25:32,410 chúng tôi đặt nó vào đó. 1643 01:25:32,410 --> 01:25:32,790 OK? 1644 01:25:32,790 --> 01:25:34,370 Vì vậy, bây giờ chúng ta sẽ in f. 1645 01:25:34,370 --> 01:25:38,490 >> Vì vậy, đầu tiên chúng ta sẽ in sao x. 1646 01:25:38,490 --> 01:25:39,640 Vì vậy, sao x là gì? 1647 01:25:39,640 --> 01:25:44,300 Một lần nữa, ngôi sao x có nghĩa là đi đến điều mà x được trỏ đến. 1648 01:25:44,300 --> 01:25:47,140 Vì vậy, x được lưu trữ 0x123 Tới đó. 1649 01:25:47,140 --> 01:25:48,490 Chúng tôi nhận được 50. 1650 01:25:48,490 --> 01:25:50,540 Vì vậy, in f. 1651 01:25:50,540 --> 01:25:54,900 Và điều đó có nghĩa là nó sẽ in 50. 1652 01:25:54,900 --> 01:25:56,850 Và sau đó trả về. 1653 01:25:56,850 --> 01:25:58,340 >> Và sau đó chúng ta có printf thứ hai. 1654 01:25:58,340 --> 01:25:59,370 Chúng tôi bây giờ phần trăm p. 1655 01:25:59,370 --> 01:26:01,680 Nếu bạn không nhìn thấy nó, đó là như thế nào bạn in một con trỏ. 1656 01:26:01,680 --> 01:26:04,960 Vì vậy, chúng tôi có phần trăm tôi, phần trăm f, và tất cả những người đã có. 1657 01:26:04,960 --> 01:26:07,160 Vì vậy, phần trăm trang, in một con trỏ. 1658 01:26:07,160 --> 01:26:08,920 >> Vì vậy, x là một con trỏ. 1659 01:26:08,920 --> 01:26:13,440 Vì vậy, nếu chúng ta sẽ in x chính nó, chúng tôi đang in những gì là thực sự bên trong 1660 01:26:13,440 --> 01:26:19,220 x, đó là 0x123 Vì vậy, lần đầu tiên f in sẽ in 50. 1661 01:26:19,220 --> 01:26:23,620 In thứ hai f sẽ in 0x123 Yeah? 1662 01:26:23,620 --> 01:26:27,460 >> TƯỢNG: Bạn có sử dụng phần trăm x để in một con trỏ? 1663 01:26:27,460 --> 01:26:31,200 >> ROB: Vì vậy, bạn sử dụng phần trăm x để in một con trỏ? 1664 01:26:31,200 --> 01:26:38,350 Vì vậy, bạn có thể nhưng phần trăm x chỉ là, nói chung, cho như thế nào nếu bạn có một số 1665 01:26:38,350 --> 01:26:40,325 số nguyên và bạn muốn in nó như là một hệ thập lục phân. 1666 01:26:40,325 --> 01:26:43,250 1667 01:26:43,250 --> 01:26:44,880 Đó chỉ là cách bạn làm điều đó. 1668 01:26:44,880 --> 01:26:47,160 >> Trong khi đó, phần trăm d sẽ in như số thập phân. 1669 01:26:47,160 --> 01:26:50,310 Đó là đã được chúng tôi có được phần trăm d. tôi chỉ là số nguyên. 1670 01:26:50,310 --> 01:26:52,690 phần trăm p là đặc biệt cho con trỏ. 1671 01:26:52,690 --> 01:26:54,060 >> Vì vậy, x là một con trỏ. 1672 01:26:54,060 --> 01:26:56,360 Chúng tôi muốn sử dụng phần trăm p. 1673 01:26:56,360 --> 01:26:57,937 Nhưng phần trăm x có thể làm việc. 1674 01:26:57,937 --> 01:26:58,414 Vâng? 1675 01:26:58,414 --> 01:26:59,664 >> TƯỢNG: [không nghe được]? 1676 01:26:59,664 --> 01:27:04,138 1677 01:27:04,138 --> 01:27:05,388 >> ROB: Vâng. 1678 01:27:05,388 --> 01:27:07,870 1679 01:27:07,870 --> 01:27:13,440 Ít nhất cho điều này call-- vì vậy tôi không bao gồm nó ở đây. 1680 01:27:13,440 --> 01:27:19,850 Tuy nhiên, hai đối số này là cần thiết bên trong khung stack này 1681 01:27:19,850 --> 01:27:23,040 cùng với bất kỳ biến địa phương printf xảy ra để được sử dụng. 1682 01:27:23,040 --> 01:27:27,020 Và sau đó các cuộc gọi tiếp theo để printf giờ bên trong printf stack frame là 1683 01:27:27,020 --> 01:27:33,960 phần trăm p n dấu gạch chéo ngược và bất cứ điều gì giá trị của x là, đó là 0x123. 1684 01:27:33,960 --> 01:27:34,425 Vâng? 1685 01:27:34,425 --> 01:27:35,675 >> TƯỢNG: [không nghe được]? 1686 01:27:35,675 --> 01:27:38,145 1687 01:27:38,145 --> 01:27:40,880 >> ROB: Nó sẽ in một cái gì đó trông như thế này. 1688 01:27:40,880 --> 01:27:41,846 >> TƯỢNG: [không nghe được]. 1689 01:27:41,846 --> 01:27:44,510 >> ROB: Vì vậy, nó in nó ở dạng địa chỉ. 1690 01:27:44,510 --> 01:27:47,003 Nó trông giống như một địa chỉ. 1691 01:27:47,003 --> 01:27:47,494 Vâng? 1692 01:27:47,494 --> 01:27:49,458 >> TƯỢNG: [không nghe được]? 1693 01:27:49,458 --> 01:27:51,075 >> ROB: Tại sao là gì? 1694 01:27:51,075 --> 01:27:52,920 >> TƯỢNG: [không nghe được]? 1695 01:27:52,920 --> 01:27:55,240 >> ROB: Tại sao con trỏ này 4 byte? 1696 01:27:55,240 --> 01:27:58,500 Vì vậy, có cả một bó 0 ở phía trước này. 1697 01:27:58,500 --> 01:28:03,740 Vì vậy, nó thực sự 0x0000000123. 1698 01:28:03,740 --> 01:28:06,510 Trên hệ thống 64-bit, sẽ có một bó toàn bộ nhiều hơn số không. 1699 01:28:06,510 --> 01:28:11,410 1700 01:28:11,410 --> 01:28:11,900 Vâng? 1701 01:28:11,900 --> 01:28:13,150 >> TƯỢNG: [không nghe được]. 1702 01:28:13,150 --> 01:28:17,290 1703 01:28:17,290 --> 01:28:21,130 >> ROB: Vì vậy, các printf đầu tiên sẽ print-- 1704 01:28:21,130 --> 01:28:21,980 >> TƯỢNG: [không nghe được]. 1705 01:28:21,980 --> 01:28:24,420 >> ROB: Vâng, nó sẽ in những gì x được trỏ đến. 1706 01:28:24,420 --> 01:28:27,030 1707 01:28:27,030 --> 01:28:29,070 Sao nói điều này là Điều trỏ đến. 1708 01:28:29,070 --> 01:28:30,300 Lấy nó. 1709 01:28:30,300 --> 01:28:31,455 Vì vậy, những gì là nó chỉ vào? 1710 01:28:31,455 --> 01:28:31,850 50. 1711 01:28:31,850 --> 01:28:32,410 Lấy nó. 1712 01:28:32,410 --> 01:28:33,390 Đó là những gì chúng ta sẽ in. 1713 01:28:33,390 --> 01:28:37,020 Trong khi đó, một trong những tiếp theo, chúng tôi chỉ cần in x chính nó. 1714 01:28:37,020 --> 01:28:38,850 Bên trong của e là gì? 1715 01:28:38,850 --> 01:28:43,710 0x123. 1716 01:28:43,710 --> 01:28:44,500 OK. 1717 01:28:44,500 --> 01:28:46,620 >> Và sau đó, cuối cùng, chúng ta có tự do. 1718 01:28:46,620 --> 01:28:48,040 Chúng ta đang đi qua để giải phóng? 1719 01:28:48,040 --> 01:28:49,470 Chúng tôi đang đi qua x. 1720 01:28:49,470 --> 01:28:52,380 Đó là thời gian tôi thực sự hiển thị nó trong khung stack. 1721 01:28:52,380 --> 01:28:56,370 >> Vì vậy, chúng tôi đang đi qua giá trị 0x123 để giải thoát. 1722 01:28:56,370 --> 01:28:59,070 Vì vậy, bây giờ miễn phí biết, tất cả các bên phải, Tôi phải đi đến đống 1723 01:28:59,070 --> 01:29:00,050 và miễn phí bộ nhớ. 1724 01:29:00,050 --> 01:29:03,920 Nó không còn sử dụng những gì là tại địa chỉ 0x123. 1725 01:29:03,920 --> 01:29:07,010 >> Vì vậy, miễn phí sẽ phát hành rằng từ đống. 1726 01:29:07,010 --> 01:29:09,490 Bây giờ chúng tôi là đống rỗng một lần nữa. 1727 01:29:09,490 --> 01:29:11,120 Chúng tôi không có rò rỉ bộ nhớ. 1728 01:29:11,120 --> 01:29:12,940 Bây giờ miễn phí sẽ trở lại. 1729 01:29:12,940 --> 01:29:16,130 Chú ý rằng x vẫn là 0x123. 1730 01:29:16,130 --> 01:29:18,240 Nhưng mà bây giờ không phải là bộ nhớ hợp lệ. 1731 01:29:18,240 --> 01:29:21,220 1732 01:29:21,220 --> 01:29:23,986 Chúng tôi nên không còn tới đích x. 1733 01:29:23,986 --> 01:29:24,440 Vâng? 1734 01:29:24,440 --> 01:29:27,240 >> TƯỢNG: là trở về 0 dư thừa? 1735 01:29:27,240 --> 01:29:28,290 >> ROB: Sản returen 0 dư thừa? 1736 01:29:28,290 --> 01:29:31,110 Có. 1737 01:29:31,110 --> 01:29:33,950 Chúng tôi chỉ cần đặt rằng có vì chúng tôi có một sự trở lại không khí. 1738 01:29:33,950 --> 01:29:36,830 Vì vậy, nó giống như, yeah, cho phép bao gồm sự trở lại 0. 1739 01:29:36,830 --> 01:29:37,310 Vâng? 1740 01:29:37,310 --> 01:29:38,560 >> TƯỢNG: [không nghe được]? 1741 01:29:38,560 --> 01:29:42,110 1742 01:29:42,110 --> 01:29:45,580 >> ROB: Vì vậy, sau khi x miễn phí, những gì sẽ xảy ra nếu chúng tôi cố gắng để tới đích của con trỏ? 1743 01:29:45,580 --> 01:29:47,240 Có thể là không có gì sai trái. 1744 01:29:47,240 --> 01:29:49,330 Có thể là chúng tôi vẫn sẽ nhận được 50. 1745 01:29:49,330 --> 01:29:53,590 >> Có thể, cũng có thể, đó là bộ nhớ hiện đang được sử dụng cho cái gì khác. 1746 01:29:53,590 --> 01:29:57,140 Vì vậy, đó là hành vi không xác định. 1747 01:29:57,140 --> 01:30:00,772 Và không xác định có nghĩa là bất cứ điều gì có thể xảy ra. 1748 01:30:00,772 --> 01:30:01,250 Vâng? 1749 01:30:01,250 --> 01:30:02,500 >> TƯỢNG: [không nghe được]? 1750 01:30:02,500 --> 01:30:07,942 1751 01:30:07,942 --> 01:30:10,830 >> ROB: Không, vì vậy nếu bạn chỉ định x đến cái gì khác. 1752 01:30:10,830 --> 01:30:15,870 Vì vậy, nếu ở đây chúng tôi đã nói x bằng một cái gì đó malloc else-- 1753 01:30:15,870 --> 01:30:17,100 malloc kích thước event-- 1754 01:30:17,100 --> 01:30:20,180 sau đó khối ban đầu bộ nhớ không được giải phóng. 1755 01:30:20,180 --> 01:30:21,490 Và chúng tôi đã chính thức đánh mất nó. 1756 01:30:21,490 --> 01:30:23,150 Đó là một rò rỉ bộ nhớ. 1757 01:30:23,150 --> 01:30:25,090 Chúng tôi đã mất tất cả tài liệu tham khảo với khối bộ nhớ. 1758 01:30:25,090 --> 01:30:26,827 Vì vậy, không có cách nào chúng tôi bao giờ có thể giải phóng nó. 1759 01:30:26,827 --> 01:30:32,074 1760 01:30:32,074 --> 01:30:36,630 OK, vì vậy sau đó trở về 0 có nghĩa là thực hiện. 1761 01:30:36,630 --> 01:30:37,900 >> Được rồi, vậy chồng tràn. 1762 01:30:37,900 --> 01:30:39,320 Ý tưởng ở đây là gì? 1763 01:30:39,320 --> 01:30:41,210 Vì vậy, hãy nhớ rằng, đống là đi xuống. 1764 01:30:41,210 --> 01:30:43,480 Chồng đang đi lên. 1765 01:30:43,480 --> 01:30:48,000 Vì vậy, đây là ví dụ từ bài giảng, Tôi nghĩ rằng, đó chính là chỉ cần đi để 1766 01:30:48,000 --> 01:30:51,380 gọi chức năng này foo, mà là có để gọi chính nó đệ quy hơn và 1767 01:30:51,380 --> 01:30:52,320 trên một lần nữa. 1768 01:30:52,320 --> 01:30:55,370 >> Vì vậy, ngăn xếp khung sẽ làm việc chính xác như nhau. 1769 01:30:55,370 --> 01:30:58,130 Vì vậy, chúng ta sẽ bắt đầu với chính như ngăn xếp khung phía dưới. 1770 01:30:58,130 --> 01:31:02,000 Sau đó, chính là sẽ gọi foo, mà là sẽ có được một khung stack. 1771 01:31:02,000 --> 01:31:04,260 >> Sau đó foo sẽ gọi foo một lần nữa, đó là sẽ có được 1772 01:31:04,260 --> 01:31:05,500 một khung stack. 1773 01:31:05,500 --> 01:31:08,270 Và sau đó một lần nữa, và một lần nữa, và một lần nữa, và một lần nữa cho đến khi, cuối cùng, chúng tôi chạy 1774 01:31:08,270 --> 01:31:09,190 vào đống. 1775 01:31:09,190 --> 01:31:11,990 Vì vậy, đây là cách chúng ta có được một lỗi tràn stack. 1776 01:31:11,990 --> 01:31:14,910 Và vào thời điểm này, bạn seg lỗi. 1777 01:31:14,910 --> 01:31:17,335 Hoặc bạn muốn thực sự seg lỗi trước thời điểm này nhưng yeah. 1778 01:31:17,335 --> 01:31:19,660 >> TƯỢNG: Sản phẩm cốt lõi đổ tương tự như lỗi seg? 1779 01:31:19,660 --> 01:31:26,140 >> ROB: Vì vậy, bạn sẽ thấy phân khúc lõi đổ lỗi. 1780 01:31:26,140 --> 01:31:28,760 Bạn nhận được một bãi chứa lõi khi bạn seg lỗi. 1781 01:31:28,760 --> 01:31:32,580 Và nó giống như một bãi chứa của tất cả các nội dung của bộ nhớ hiện tại của bạn để 1782 01:31:32,580 --> 01:31:36,670 mà bạn có thể thử và xác định tại sao bạn SEG đổ lỗi. 1783 01:31:36,670 --> 01:31:37,135 Vâng? 1784 01:31:37,135 --> 01:31:38,385 >> TƯỢNG: [không nghe được]? 1785 01:31:38,385 --> 01:31:40,855 1786 01:31:40,855 --> 01:31:45,460 >> ROB: Vì vậy, một phương tiện lỗi phân khúc có một chồng tràn. 1787 01:31:45,460 --> 01:31:47,060 Vì vậy, không nhất thiết. 1788 01:31:47,060 --> 01:31:49,880 Một lỗi phân khúc có nghĩa là bạn bộ nhớ cảm động theo một cách 1789 01:31:49,880 --> 01:31:50,880 bạn không nên. 1790 01:31:50,880 --> 01:31:54,750 Vì vậy, một cách để điều đó xảy ra là, khi bạn ngăn xếp tràn, chúng ta bắt đầu cảm động 1791 01:31:54,750 --> 01:31:58,736 bộ nhớ trong một cách mà chúng ta không nên. 1792 01:31:58,736 --> 01:31:59,208 Vâng? 1793 01:31:59,208 --> 01:32:00,458 >> TƯỢNG: [không nghe được]? 1794 01:32:00,458 --> 01:32:03,456 1795 01:32:03,456 --> 01:32:05,830 >> ROB: Vì vậy, bên trong một vòng lặp vô hạn. 1796 01:32:05,830 --> 01:32:08,770 Giống như, điều này giống như một đệ quy vô hạn vòng lặp và vì vậy chúng tôi nhận được một 1797 01:32:08,770 --> 01:32:09,770 ngăn xếp khung mỗi lần. 1798 01:32:09,770 --> 01:32:13,540 Nhưng chỉ bên trong của một thường xuyên vô hạn trong khi one-- 1799 01:32:13,540 --> 01:32:16,390 tốt, chúng ta thậm chí không in f-- 1800 01:32:16,390 --> 01:32:17,040 làm điều gì đó. 1801 01:32:17,040 --> 01:32:18,390 Bất cứ điều gì. 1802 01:32:18,390 --> 01:32:20,610 >> Chúng tôi sẽ không nhận được một khung stack. 1803 01:32:20,610 --> 01:32:22,530 Chúng ta sẽ tiếp tục vòng lặp hơn chỉ dẫn duy nhất này. 1804 01:32:22,530 --> 01:32:23,920 Các stack là không phát triển. 1805 01:32:23,920 --> 01:32:27,290 Đó là một thực tế là mỗi đệ quy gọi cho chúng ta một khung stack. 1806 01:32:27,290 --> 01:32:31,231 Đó là lý do tại sao chúng tôi có được một chồng tràn. 1807 01:32:31,231 --> 01:32:31,728 Vâng? 1808 01:32:31,728 --> 01:32:38,189 >> TƯỢNG: Vì vậy, nếu bạn nói để có được trong khi vòng lặp và sau đó [không nghe được]? 1809 01:32:38,189 --> 01:32:42,000 >> ROB: Vì vậy, nếu bên trong vòng lặp while có một printf, bạn vẫn sẽ 1810 01:32:42,000 --> 01:32:42,790 lỗi không seg. 1811 01:32:42,790 --> 01:32:46,090 Tôi chỉ không muốn nhầm lẫn giữa việc. 1812 01:32:46,090 --> 01:32:46,610 Nó sẽ lặp. 1813 01:32:46,610 --> 01:32:48,225 Bạn sẽ nhận được một chồng đơn khung cho printf. 1814 01:32:48,225 --> 01:32:49,580 >> Sau đó printf sẽ trở lại. 1815 01:32:49,580 --> 01:32:50,280 Sau đó, bạn sẽ lặp lại. 1816 01:32:50,280 --> 01:32:51,460 Bạn sẽ nhận được một chồng đơn khung cho printf. 1817 01:32:51,460 --> 01:32:52,850 Nó sẽ trở lại. 1818 01:32:52,850 --> 01:32:54,060 Độc stack frame. 1819 01:32:54,060 --> 01:33:00,215 Vì vậy, bạn không nhận được vô hạn chồng chất lên khung stack. 1820 01:33:00,215 --> 01:33:03,185 >> TƯỢNG: [không nghe được]? 1821 01:33:03,185 --> 01:33:04,040 >> ROB: Có. 1822 01:33:04,040 --> 01:33:09,360 Vì vậy, đây sẽ xảy ra tràn stack bởi vì không ai trong số các 1823 01:33:09,360 --> 01:33:11,600 các cuộc gọi đến foo đang quay trở lại. 1824 01:33:11,600 --> 01:33:15,250 Vì vậy, nếu chúng ta trở lại, sau đó chúng tôi sẽ bắt đầu mất khung stack. 1825 01:33:15,250 --> 01:33:17,870 Và sau đó chúng tôi sẽ không ngăn xếp tràn. 1826 01:33:17,870 --> 01:33:20,070 Và đó là lý do tại sao bạn cần có một trường hợp cơ sở cho các chức năng cá nhân của bạn. 1827 01:33:20,070 --> 01:33:22,992 1828 01:33:22,992 --> 01:33:23,479 Vâng? 1829 01:33:23,479 --> 01:33:27,375 >> ĐỐI TƯỢNG: Là kích thước tiềm năng và ngăn xếp cho các đống tương tự cho 1830 01:33:27,375 --> 01:33:29,880 tất cả các chương trình? 1831 01:33:29,880 --> 01:33:31,910 >> ROB: Khoảng. 1832 01:33:31,910 --> 01:33:35,090 Là kích thước tiềm năng của ngăn xếp và đống giống nhau cho tất cả các chương trình? 1833 01:33:35,090 --> 01:33:37,180 Khoảng. 1834 01:33:37,180 --> 01:33:40,080 Có một số ngẫu nhiên để nơi chồng bắt đầu và 1835 01:33:40,080 --> 01:33:42,400 nơi đống bắt đầu. 1836 01:33:42,400 --> 01:33:45,870 Nếu bạn xảy ra để có một toàn bộ rất nhiều biến toàn cầu và những thứ, có lẽ bạn 1837 01:33:45,870 --> 01:33:49,520 lấy đi từ một số không gian cho đống của bạn. 1838 01:33:49,520 --> 01:33:54,060 >> Trên hệ thống 64-bit, bạn hầu như có bộ nhớ vô hạn. 1839 01:33:54,060 --> 01:33:55,820 Có quá nhiều. 1840 01:33:55,820 --> 01:33:59,250 Giữa 32 bit và 64 bit, có là một sự khác biệt đáng kể. 1841 01:33:59,250 --> 01:34:02,350 >> Bạn sẽ nhận được nhiều hơn cả ngăn xếp và không gian đống trên 64-bit 1842 01:34:02,350 --> 01:34:05,810 hệ thống bởi vì có nhiều chỉ địa chỉ mà họ có thể sử dụng. 1843 01:34:05,810 --> 01:34:09,360 Tuy nhiên, trên một hệ thống cá nhân, nó sẽ có khoảng cùng một lượng ngăn xếp 1844 01:34:09,360 --> 01:34:10,785 và không gian đống. 1845 01:34:10,785 --> 01:34:13,635 1846 01:34:13,635 --> 01:34:15,530 Tất cả các quyền. 1847 01:34:15,530 --> 01:34:18,220 >> Vì vậy, điều cuối cùng là biên dịch. 1848 01:34:18,220 --> 01:34:19,810 Vì vậy, bạn nên biết quá trình này. 1849 01:34:19,810 --> 01:34:22,240 Có bốn bước lớn. 1850 01:34:22,240 --> 01:34:24,400 Vì vậy, đầu tiên nên dễ nhớ. 1851 01:34:24,400 --> 01:34:25,085 Tiền xử lý. 1852 01:34:25,085 --> 01:34:28,390 Nó có tiền tố trước trong đó. 1853 01:34:28,390 --> 01:34:32,080 Vì vậy, nó đến trước khi mọi thứ khác. 1854 01:34:32,080 --> 01:34:34,000 >> Điều cần nhớ là băm. 1855 01:34:34,000 --> 01:34:37,250 Vì vậy, định nghĩa và băm băm bao gồm trong tất cả những người. 1856 01:34:37,250 --> 01:34:39,560 Đó là tất cả tiền xử lý chỉ thị. 1857 01:34:39,560 --> 01:34:42,030 Đây là những điều mà các tiền xử lý chăm sóc. 1858 01:34:42,030 --> 01:34:43,680 >> Vì vậy, những gì hiện một bộ xử lý trước làm gì? 1859 01:34:43,680 --> 01:34:44,850 Đó là một điều thực sự ngu ngốc. 1860 01:34:44,850 --> 01:34:49,380 Tất cả đó là có khả năng là tất cả các sao chép và cắt, dán và hoạt động. 1861 01:34:49,380 --> 01:34:51,790 >> Vì vậy, băm bao gồm tiêu chuẩn i0 chấm h. 1862 01:34:51,790 --> 01:34:52,990 Rằng làm là gì? 1863 01:34:52,990 --> 01:34:56,610 Nó lấy tiêu chuẩn i0 chấm h tập tin và dán nó vào đầu 1864 01:34:56,610 --> 01:34:58,960 bất cứ nơi nào nó nói băm bao gồm tiêu chuẩn i0 chấm h. 1865 01:34:58,960 --> 01:35:02,480 >> Và bất kỳ băm xác định rằng chúng tôi đã nhìn thấy, những gì là làm gì? 1866 01:35:02,480 --> 01:35:06,730 Sao chép giá trị của nó mà băm xác định được định nghĩa là và dán mà 1867 01:35:06,730 --> 01:35:08,500 bất cứ nơi nào bạn đang sử dụng giá trị. 1868 01:35:08,500 --> 01:35:13,400 Vì vậy, các tiền xử lý chỉ làm thực sự văn bản đơn giản dựa trên hoạt động. 1869 01:35:13,400 --> 01:35:15,870 Nó không có gì thông minh. 1870 01:35:15,870 --> 01:35:18,920 Vì vậy, mọi thứ khác là phức tạp hơn. 1871 01:35:18,920 --> 01:35:22,970 >> Vì vậy, bây giờ đó là tiền xử lý thực hiện, chúng tôi thực sự biên dịch. 1872 01:35:22,970 --> 01:35:24,320 Vậy biên dịch nghĩa là gì? 1873 01:35:24,320 --> 01:35:27,310 Chúng ta đang đi từ mã c để mã lắp ráp. 1874 01:35:27,310 --> 01:35:27,570 Vâng? 1875 01:35:27,570 --> 01:35:28,820 >> TƯỢNG: [không nghe được]? 1876 01:35:28,820 --> 01:35:32,390 1877 01:35:32,390 --> 01:35:34,220 >> ROB: Vâng, chúng tôi bắt gặp đó. 1878 01:35:34,220 --> 01:35:36,880 1879 01:35:36,880 --> 01:35:38,660 Vì vậy, biên dịch. 1880 01:35:38,660 --> 01:35:40,310 Chúng tôi sẽ từ c để lắp ráp. 1881 01:35:40,310 --> 01:35:42,470 Vì vậy, đây là một sự thay đổi ngôn ngữ thực tế. 1882 01:35:42,470 --> 01:35:45,240 Lập bản thân có nghĩa là đi từ một ngôn ngữ cấp cao hơn để 1883 01:35:45,240 --> 01:35:47,340 một ngôn ngữ cấp thấp hơn. 1884 01:35:47,340 --> 01:35:50,720 >> Và c là một ngôn ngữ cấp cao so với lắp ráp. 1885 01:35:50,720 --> 01:35:52,320 Lắp ráp là gì? 1886 01:35:52,320 --> 01:35:56,440 Hướng dẫn của nó mà, khá nhiều, làm cho CPU của bạn. 1887 01:35:56,440 --> 01:35:59,130 Tuy nhiên, máy tính của bạn vẫn không không hiểu lắp ráp. 1888 01:35:59,130 --> 01:36:01,570 Nó chỉ hiểu những người thân và số không. 1889 01:36:01,570 --> 01:36:06,160 Vì vậy, bước tiếp theo là lắp ráp, mà đưa chúng ta từ các hướng dẫn 1890 01:36:06,160 --> 01:36:08,760 CPU của bạn hiểu và thực sự dịch chúng, để 1891 01:36:08,760 --> 01:36:10,820 những người và số không. 1892 01:36:10,820 --> 01:36:13,570 >> Vì vậy, C để lắp ráp để nhị phân. 1893 01:36:13,570 --> 01:36:15,870 Nhưng tôi không có thực thi được nêu ra. 1894 01:36:15,870 --> 01:36:19,550 Vì vậy, suy nghĩ của các thư viện CS50. 1895 01:36:19,550 --> 01:36:23,070 Chúng tôi đã cung cấp cho bạn một số nhị phân cho CS50 thư viện này, trong đó có GetString 1896 01:36:23,070 --> 01:36:24,400 và getInt và tất cả những gì. 1897 01:36:24,400 --> 01:36:25,700 >> Nhưng CS50 library-- 1898 01:36:25,700 --> 01:36:27,650 trong và của itself-- không thực thi. 1899 01:36:27,650 --> 01:36:29,570 Nó không có một chức năng chính. 1900 01:36:29,570 --> 01:36:32,230 Nó chỉ là một loạt các nhị phân mà bạn có thể sử dụng. 1901 01:36:32,230 --> 01:36:41,730 Vì vậy, liên kết là cách chúng tôi mang lại cùng tất cả các tập tin nhị phân khác nhau 1902 01:36:41,730 --> 01:36:43,110 vào một thực thi thực tế. 1903 01:36:43,110 --> 01:36:45,900 Một là bạn có thể gõ dot giảm một dấu chấm ra. 1904 01:36:45,900 --> 01:36:51,660 >> Vì vậy, đây cũng giống như các tập tin mà bạn viết, - bất cứ chương trình của bạn is-- 1905 01:36:51,660 --> 01:36:53,620 Ceaser điểm c. 1906 01:36:53,620 --> 01:36:55,100 Nhưng bây giờ nó được biên soạn xuống nhị phân. 1907 01:36:55,100 --> 01:36:56,480 Vì vậy, Ceaser dot o. 1908 01:36:56,480 --> 01:36:59,620 Và đây là thư viện của chúng tôi CS50 nhị phân. 1909 01:36:59,620 --> 01:37:02,284 Và họ đang được kết hợp vào tập tin thực thi duy nhất. 1910 01:37:02,284 --> 01:37:02,758 Vâng? 1911 01:37:02,758 --> 01:37:04,008 >> TƯỢNG: [không nghe được]? 1912 01:37:04,008 --> 01:37:08,800 1913 01:37:08,800 --> 01:37:12,710 >> ROB: Vì vậy, đầu tiên bao gồm, nhớ, băm bao gồm thực sự là một 1914 01:37:12,710 --> 01:37:13,810 tiền xử lý bước. 1915 01:37:13,810 --> 01:37:14,750 Nhưng đó là riêng biệt. 1916 01:37:14,750 --> 01:37:20,730 Nếu bạn không sử dụng bất kỳ chức năng đang ở bên ngoài của tập tin duy nhất của bạn sau đó, 1917 01:37:20,730 --> 01:37:26,100 không có, bạn không cần phải liên kết bất cứ điều gì kể từ khi bạn có tất cả mọi thứ. 1918 01:37:26,100 --> 01:37:30,310 >> Điều đó nói rằng, printf đang được liên kết trong. 1919 01:37:30,310 --> 01:37:32,820 Nếu bạn đã từng sử dụng printf, đó là một cái gì đó mà cần phải được liên kết trong 1920 01:37:32,820 --> 01:37:35,740 bởi vì bạn đã không viết đó. 1921 01:37:35,740 --> 01:37:39,530 Và, trên thực tế, printf là tự động liên kết trong. 1922 01:37:39,530 --> 01:37:42,760 Bạn biết làm thế nào tại dòng lệnh hoặc khi bạn gõ thực hiện, bạn sẽ thấy nó có 1923 01:37:42,760 --> 01:37:46,690 dash l CS50, trong đó có liên kết trong thư viện CS50? 1924 01:37:46,690 --> 01:37:49,070 Printf, và các công cụ như vậy, sẽ được liên kết tự động. 1925 01:37:49,070 --> 01:37:51,730 1926 01:37:51,730 --> 01:37:53,930 Bất kỳ câu hỏi khác về bất cứ điều gì? 1927 01:37:53,930 --> 01:37:56,280 >> TƯỢNG: [không nghe được]? 1928 01:37:56,280 --> 01:37:58,300 >> ROB: Liên kết? 1929 01:37:58,300 --> 01:38:03,450 Chúng tôi có một bó toàn bộ tập tin nhị phân khác nhau. 1930 01:38:03,450 --> 01:38:06,410 Đây là ví dụ kinh điển mà chúng tôi sử dụng là thư viện CS50. 1931 01:38:06,410 --> 01:38:09,960 Chúng tôi đã biên soạn và cung cấp cho bạn nhị phân cho các thư viện CS50 này. 1932 01:38:09,960 --> 01:38:12,410 >> Bạn muốn sử dụng GetString trong chương trình của bạn. 1933 01:38:12,410 --> 01:38:14,750 Vì vậy, bạn đi và sử dụng GetString. 1934 01:38:14,750 --> 01:38:19,700 Nhưng nếu không có mã nhị phân của tôi cho GetString, khi bạn biên dịch mã của bạn 1935 01:38:19,700 --> 01:38:23,140 xuống, bạn có thể không thực sự chạy của bạn chương trình vì GetString String 1936 01:38:23,140 --> 01:38:25,080 chưa hoàn toàn xác định. 1937 01:38:25,080 --> 01:38:29,220 >> Đó là chỉ khi bạn liên kết trong hệ nhị phân của tôi có chứa GetString mà bây giờ, tất cả 1938 01:38:29,220 --> 01:38:31,130 đúng, tôi thực sự có thể thực hiện GetString. 1939 01:38:31,130 --> 01:38:32,330 Tập tin của tôi được hoàn tất. 1940 01:38:32,330 --> 01:38:34,208 Và tôi có thể chạy này. 1941 01:38:34,208 --> 01:38:34,697 Vâng? 1942 01:38:34,697 --> 01:38:37,631 >> TƯỢNG: Có nối liền chuyển đổi nhị phân để thực thi? 1943 01:38:37,631 --> 01:38:42,032 Vì vậy, ngay cả khi bạn không có khác thư viện, nó sẽ không còn được 1944 01:38:42,032 --> 01:38:44,477 cần thiết để dịch các [không nghe được]? 1945 01:38:44,477 --> 01:38:48,640 >> ROB: Vì vậy, một thực thi vẫn còn trong hệ nhị phân. 1946 01:38:48,640 --> 01:38:51,750 Nó chỉ là một kết hợp toàn bộ loạt các tập tin nhị phân. 1947 01:38:51,750 --> 01:38:55,124 1948 01:38:55,124 --> 01:38:56,591 >> TƯỢNG: Cảm ơn bạn rất nhiều. 1949 01:38:56,591 --> 01:38:58,560 >> ROB: Không có vấn đề. 1950 01:38:58,560 --> 01:38:59,540 Bất kỳ câu hỏi nào khác không? 1951 01:38:59,540 --> 01:39:02,001 Nếu không, tất cả chúng ta thiết lập. 1952 01:39:02,001 --> 01:39:02,690 Tất cả các quyền. 1953 01:39:02,690 --> 01:39:02,990 Cảm ơn. 1954 01:39:02,990 --> 01:39:03,590 >> [Vỗ tay] 1955 01:39:03,590 --> 01:39:04,490 >> TƯỢNG: Cảm ơn bạn. 1956 01:39:04,490 --> 01:39:05,740 >> ROB: Vâng. 1957 01:39:05,740 --> 01:39:06,582