1 00:00:00,000 --> 00:00:10,550 2 00:00:10,550 --> 00:00:14,050 >> DAVID J. Malan: Đây là CS50 và đây là khởi đầu của tuần thứ tư. 3 00:00:14,050 --> 00:00:18,630 Và, cậu bé, là Volkswagen ở rắc rối bởi vì tất cả các phần mềm. 4 00:00:18,630 --> 00:00:20,264 Chúng ta hãy lấy một cái nhìn. 5 00:00:20,264 --> 00:00:20,930 [VIDEO PLAYBACK] 6 00:00:20,930 --> 00:00:25,560 -Cars, Các nhân vật thông minh nhất trong các bộ phim Fast and Furious. 7 00:00:25,560 --> 00:00:29,100 Tuần xuất ô tô Đức này Volkswagen thấy mình 8 00:00:29,100 --> 00:00:32,490 ở giữa một vụ bê bối của tỷ lệ có khả năng phạm tội. 9 00:00:32,490 --> 00:00:36,060 >> -Volkswagen Là giằng cho tỷ tiền phạt, phí phạm pháp 10 00:00:36,060 --> 00:00:38,560 cho giám đốc điều hành của nó, như công ty xin lỗi 11 00:00:38,560 --> 00:00:41,840 cho gian lận 11 triệu xe đến giúp nó đánh bại kiểm tra khí thải. 12 00:00:41,840 --> 00:00:44,950 >> Mô hình động cơ diesel -Certain là được thiết kế với phần mềm tinh vi 13 00:00:44,950 --> 00:00:48,440 rằng thông tin đã qua sử dụng bao gồm các vị trí của các tay lái và xe 14 00:00:48,440 --> 00:00:51,870 tăng tốc độ để xác định chiếc xe trải qua thử nghiệm khí thải. 15 00:00:51,870 --> 00:00:55,650 Trong bối cảnh đó, động cơ sẽ làm giảm lượng khí thải độc hại. 16 00:00:55,650 --> 00:00:59,070 Nhưng chiếc xe đã được sắp đặt để bỏ qua mà khi nó đã được lái. 17 00:00:59,070 --> 00:01:03,320 Lượng khí thải tăng 10-40 lần cao hơn mức EPA chấp nhận được. 18 00:01:03,320 --> 00:01:04,280 >> [END PLAYBACK] 19 00:01:04,280 --> 00:01:05,220 >> DAVID J. Malan: Vì vậy, chúng ta hãy hãy xem này 20 00:01:05,220 --> 00:01:07,250 và xem chính xác như thế nào đây có thể được thực hiện 21 00:01:07,250 --> 00:01:09,680 và làm thế nào điều này có thể ảnh hưởng đến rất nhiều xe như thế này. 22 00:01:09,680 --> 00:01:12,840 Vì vậy, trong tay của tôi ở đây là báo chí phát hành đã được ban hành bởi các EPA-- 23 00:01:12,840 --> 00:01:14,620 các môi trường Cơ quan bảo vệ mà 24 00:01:14,620 --> 00:01:18,032 là cơ quan quản lý của Mỹ rằng xử lý các vấn đề môi trường, 25 00:01:18,032 --> 00:01:19,740 và sau đó là thực tế thông báo pháp lý đó là 26 00:01:19,740 --> 00:01:22,420 gửi cho Volkswagen chỉ một vài ngày trước. 27 00:01:22,420 --> 00:01:26,530 >> Vì vậy EPA viết, và tiết lộ với doanh nghiệp công khai, một phần mềm tinh vi 28 00:01:26,530 --> 00:01:29,390 thuật toán trên một số Xe Volkswagen phát hiện 29 00:01:29,390 --> 00:01:32,630 khi xe đang trải qua kiểm tra khí thải chính thức 30 00:01:32,630 --> 00:01:36,505 và biến khí thải toàn kiểm soát trên chỉ trong thời gian thử nghiệm. 31 00:01:36,505 --> 00:01:38,380 Hiệu quả của những ô nhiễm xe 32 00:01:38,380 --> 00:01:43,260 thiết bị kiểm soát khí thải là rất lớn giảm trong tất cả các lái xe bình thường 33 00:01:43,260 --> 00:01:44,320 tình huống. 34 00:01:44,320 --> 00:01:48,190 Điều này dẫn đến những chiếc ô tô đáp ứng tiêu chuẩn trong phòng thí nghiệm hoặc thử nghiệm 35 00:01:48,190 --> 00:01:52,790 ga, nhưng trong quá trình hoạt động bình thường phát ra oxides-- nitơ hoặc NOx-- 36 00:01:52,790 --> 00:01:54,950 tại lên đến 40 lần tiêu chuẩn. 37 00:01:54,950 --> 00:01:58,220 Các phần mềm được sản xuất bởi Volkswagen là một thiết bị quote unquote, thất bại, 38 00:01:58,220 --> 00:02:00,650 theo định nghĩa của sạch Đạo luật không khí ở Mỹ. 39 00:02:00,650 --> 00:02:03,410 >> Họ đi vào để nói rằng EPA và cơ quan khác 40 00:02:03,410 --> 00:02:07,020 phát hiện các thiết bị thất bại phần mềm sau khi phân tích độc lập 41 00:02:07,020 --> 00:02:09,660 bởi các nhà nghiên cứu tại Tây Đại học Virginia. 42 00:02:09,660 --> 00:02:14,160 Ô nhiễm NOx góp phần nitrogen dioxide, mặt đất ôzôn, 43 00:02:14,160 --> 00:02:15,700 và các hạt vật chất tốt. 44 00:02:15,700 --> 00:02:18,090 Tiếp xúc với những chất gây ô nhiễm có liên quan 45 00:02:18,090 --> 00:02:20,870 với một loạt các ảnh hưởng sức khỏe nghiêm trọng, 46 00:02:20,870 --> 00:02:23,637 bao gồm tăng bệnh hen suyễn các cuộc tấn công và đường hô hấp khác 47 00:02:23,637 --> 00:02:26,470 bệnh có thể nghiêm trọng đủ cử người đến bệnh viện. 48 00:02:26,470 --> 00:02:28,660 Tiếp xúc với ozone và hạt vật chất có cũng 49 00:02:28,660 --> 00:02:31,960 được liên kết với non tử vong do hô hấp liên quan 50 00:02:31,960 --> 00:02:35,690 tim mạch hoặc các hiệu ứng liên quan. 51 00:02:35,690 --> 00:02:38,940 Trẻ em, người già, những người có bệnh hô hấp từ trước 52 00:02:38,940 --> 00:02:42,840 đặc biệt có nguy cơ ảnh hưởng sức khỏe của các chất gây ô nhiễm. 53 00:02:42,840 --> 00:02:45,056 >> Đủ để nói, nó khá nghiêm trọng. 54 00:02:45,056 --> 00:02:46,930 Và chúng ta hãy đi vào để đọc chỉ là một đoạn trích hơn 55 00:02:46,930 --> 00:02:49,370 và sau đó chúng ta sẽ có một cái nhìn tại những tác động tiềm ẩn 56 00:02:49,370 --> 00:02:50,920 của điều này trong bối cảnh của một chiếc xe hơi. 57 00:02:50,920 --> 00:02:53,730 Cụ thể, Volkswagen sản xuất và lắp đặt 58 00:02:53,730 --> 00:02:56,210 phần mềm trong cái gọi là điều khiển điện tử 59 00:02:56,210 --> 00:02:59,320 module-- hoặc ECM-- của những chiếc xe mà cảm nhận 60 00:02:59,320 --> 00:03:03,580 khi chiếc xe đang được thử nghiệm cho tuân thủ các tiêu chuẩn khí thải EPA. 61 00:03:03,580 --> 00:03:07,510 Dựa trên yếu tố đầu vào khác nhau bao gồm các vị trí của tay lái, xe 62 00:03:07,510 --> 00:03:11,280 tốc độ, thời gian của động cơ của hoạt động, và áp suất khí quyển, 63 00:03:11,280 --> 00:03:13,720 các yếu tố đầu vào chính xác theo dõi các thông số 64 00:03:13,720 --> 00:03:17,600 các thủ tục kiểm tra liên bang sử dụng cho thử nghiệm khí thải đối với chứng nhận EPA 65 00:03:17,600 --> 00:03:18,400 mục đích. 66 00:03:18,400 --> 00:03:21,850 >> Trong thời gian thử nghiệm khí thải của EPA, phần mềm xe ECM 67 00:03:21,850 --> 00:03:25,060 chạy phần mềm đó được sản xuất kết quả phát thải phù hợp. 68 00:03:25,060 --> 00:03:28,340 Tại tất cả các lần khác, phần mềm xe ECM 69 00:03:28,340 --> 00:03:31,090 chạy một con đường riêng hiệu chuẩn mà giảm 70 00:03:31,090 --> 00:03:34,360 hiệu quả của các hệ thống kiểm soát khí thải tổng thể, 71 00:03:34,360 --> 00:03:37,864 đặc biệt là xúc tác chọn lọc giảm NOx nạc trap-- 72 00:03:37,864 --> 00:03:39,280 mà chúng ta sẽ thấy về trong một thời điểm. 73 00:03:39,280 --> 00:03:43,040 Kết quả là, lượng khí thải NOx tăng gấp 10 đến 40 lần 74 00:03:43,040 --> 00:03:47,450 trên mức phù EPA tùy thuộc vào loại chu kỳ ổ đĩa. 75 00:03:47,450 --> 00:03:50,800 >> Vì vậy, điều này thực sự có nghĩa là, và mã nguồn của phần mềm đang chạy 76 00:03:50,800 --> 00:03:53,190 trên Volkswagen có không chưa được tiết lộ công khai, 77 00:03:53,190 --> 00:03:56,460 là, có hiệu quả, điều này tương đương là một nơi nào đó bên trong 78 00:03:56,460 --> 00:03:57,830 mã của Volkswagen. 79 00:03:57,830 --> 00:04:02,200 Nếu bạn đang được thử nghiệm, và nếu xe phát hiện các yếu tố môi trường nhất định 80 00:04:02,200 --> 00:04:04,330 như vô lăng vị trí hoặc phong trào 81 00:04:04,330 --> 00:04:06,710 hoặc thiếu đó của xe hoặc bất kỳ số lượng các yếu tố khác 82 00:04:06,710 --> 00:04:09,940 hiện đang đưa ra giả thuyết là một phần của công thức này, 83 00:04:09,940 --> 00:04:12,370 họ chỉ cần bật lượng khí thải toàn kiểm soát. 84 00:04:12,370 --> 00:04:15,670 Nói cách khác, họ bắt đầu phát ra ít hơn của các chất gây ô nhiễm. 85 00:04:15,670 --> 00:04:18,769 >> Khác, trong mọi tình huống khác khi nó không được phát hiện như là 86 00:04:18,769 --> 00:04:20,790 trong phòng thí nghiệm, họ chỉ cần không. 87 00:04:20,790 --> 00:04:24,320 Và do đó, bạn có thể đơn giản hóa này vào hơn giả bê tông với một cái gì đó 88 00:04:24,320 --> 00:04:24,820 như thế này. 89 00:04:24,820 --> 00:04:27,810 Nếu các bánh xe đang quay nhưng tay lái là không, gợi ý 90 00:04:27,810 --> 00:04:30,060 rằng chiếc xe là trên một số loại xi lanh quay 91 00:04:30,060 --> 00:04:32,550 nhưng trong một số loại kho đang được thử nghiệm, 92 00:04:32,550 --> 00:04:36,070 sau đó hành xử như các EPA sẽ thích bạn. 93 00:04:36,070 --> 00:04:37,960 Nếu không thì không. 94 00:04:37,960 --> 00:04:40,420 Vì vậy, chúng ta hãy có một cái nhìn tại một video ngắn 95 00:04:40,420 --> 00:04:45,391 có một cái nhìn vào những gì các tác động là điều này thực sự một cách máy móc. 96 00:04:45,391 --> 00:04:48,620 >> [VIDEO PLAYBACK] 97 00:04:48,620 --> 00:04:52,800 >> -Last Friday the EPA công bố rằng một số Xe Volkswagen Audi thực hiện từ năm 2009 98 00:04:52,800 --> 00:04:55,840 và năm nay đã được sử dụng một thiết bị đánh bại cái gọi là 99 00:04:55,840 --> 00:04:59,060 để có được xung quanh luật khí thải được thiết kế để giữ cho không khí sạch. 100 00:04:59,060 --> 00:05:01,700 Nhưng điều đó có nghĩa là chính xác? 101 00:05:01,700 --> 00:05:04,666 >> Vâng, chiếc xe hiện đại có hàng chục các máy tính bên trong chúng. 102 00:05:04,666 --> 00:05:07,040 Và một số các máy tính này giúp phối hợp các chức năng 103 00:05:07,040 --> 00:05:09,590 của động cơ để tối ưu hiệu suất trong khi đảm bảo 104 00:05:09,590 --> 00:05:12,340 mà không có quá nhiều rác sắp ra của ống xả. 105 00:05:12,340 --> 00:05:15,170 Họ đã thực sự được làm việc cách này trong nhiều thập kỷ nay. 106 00:05:15,170 --> 00:05:17,380 Về cơ bản, mỗi phần của động cơ một chiếc xe hiện đại 107 00:05:17,380 --> 00:05:20,080 có một cảm biến hoặc điều khiển vào nó, và các máy tính 108 00:05:20,080 --> 00:05:23,460 đang đọc dữ liệu trong hàng ngàn mỗi lần điều chỉnh thứ hai làm 109 00:05:23,460 --> 00:05:26,220 như tỷ lệ nhiên liệu với không khí đó là đi vào các xi lanh. 110 00:05:26,220 --> 00:05:28,730 >> Những Volkswagen gian lận và các mô hình Audi là động cơ diesel, 111 00:05:28,730 --> 00:05:30,890 và động cơ diesel có thêm một máy tính thực sự quan trọng 112 00:05:30,890 --> 00:05:34,030 các thông số kiểm soát, đó là lượng nhiên liệu cháy không hết đi 113 00:05:34,030 --> 00:05:35,200 vào ống xả. 114 00:05:35,200 --> 00:05:36,310 Bây giờ âm thanh xấu. 115 00:05:36,310 --> 00:05:39,642 Không âm thanh như bạn muốn nhiên liệu cháy không hết đi vào ống xả. 116 00:05:39,642 --> 00:05:41,600 Nhưng trong trường hợp của một diesel, bạn có một cái gì đó 117 00:05:41,600 --> 00:05:46,110 được gọi là một cái bẫy NOx mà là một thiết bị hấp thụ và bẫy cho oxit nitơ 118 00:05:46,110 --> 00:05:48,880 đó là chất gây ô nhiễm mà có nếu không đi vào bầu khí quyển. 119 00:05:48,880 --> 00:05:53,040 Và hiệu quả của mà bẫy NOx được tăng cường với nhiên liệu cháy không hết. 120 00:05:53,040 --> 00:05:56,650 Vì vậy, một thiết bị thất bại là một chương trình đặc biệt bên trong các máy tính này có thể làm cho nó 121 00:05:56,650 --> 00:05:59,527 trông giống như chiếc xe đáp ứng phát xạ tiêu chuẩn ngay cả khi nó không. 122 00:05:59,527 --> 00:06:01,110 Volkswagen đã có một vấn đề về bàn tay của nó. 123 00:06:01,110 --> 00:06:04,050 Động cơ diesel của nó đã được biết đến để nhận nền kinh tế nhiên liệu tuyệt vời, 124 00:06:04,050 --> 00:06:07,510 nhưng cái bẫy NOx chỉ hoạt động tốt khi thêm nhiên liệu đang được sử dụng. 125 00:06:07,510 --> 00:06:10,460 Vì vậy, chiếc xe sẽ phát hiện, sử dụng thiết bị thất bại này, 126 00:06:10,460 --> 00:06:13,870 khi nó đã nhận được một lượng khí thải kiểm tra, nó sẽ sử dụng nhiên liệu hơn, 127 00:06:13,870 --> 00:06:16,830 làm các công việc bẫy NOx tốt, khí thải sẽ bị phạt. 128 00:06:16,830 --> 00:06:21,130 Nhưng sau đó bạn nhận được trên đường, các thiết bị tắt, bạn đang đốt nhiên liệu ít hơn 129 00:06:21,130 --> 00:06:24,256 nhưng bạn đang đưa nhiều như 40 lần nhiều chất ô nhiễm vào khí quyển. 130 00:06:24,256 --> 00:06:26,130 Nhưng làm thế nào heck làm xe biết rằng đó là 131 00:06:26,130 --> 00:06:27,720 đang được thử nghiệm cho phù thải? 132 00:06:27,720 --> 00:06:30,590 EPA nói rằng đó là một tinh vi hệ thống kiểm tra điều 133 00:06:30,590 --> 00:06:34,090 như vị trí tay lái, tốc độ, bao lâu động cơ đã được trên, 134 00:06:34,090 --> 00:06:35,507 và thậm chí áp suất khí quyển. 135 00:06:35,507 --> 00:06:37,673 Nói cách khác, đã có không có cách này là tình cờ 136 00:06:37,673 --> 00:06:40,260 vì phần mềm là được thiết kế rất cẩn thận để phát hiện 137 00:06:40,260 --> 00:06:41,630 một thử nghiệm khí thải chính thức. 138 00:06:41,630 --> 00:06:43,588 Đó là một số khá nghiêm trọng lừa dối và đó là 139 00:06:43,588 --> 00:06:45,420 tại sao Volkswagen là trong rắc rối nghiêm trọng như vậy. 140 00:06:45,420 --> 00:06:48,600 Trong thực tế, Giám đốc điều hành của họ, Martin Winterkorn, vừa bước xuống. 141 00:06:48,600 --> 00:06:49,820 >> Vì vậy, những gì sẽ xảy ra tiếp theo? 142 00:06:49,820 --> 00:06:53,900 Vâng, nếu bạn là một trong nửa triệu Jettas diesel, Beatles, Golfs, Passats, 143 00:06:53,900 --> 00:06:56,220 hay Audi A3s thực, những tin tức tốt là được 144 00:06:56,220 --> 00:06:57,886 rằng xe của bạn vẫn an toàn khi lái xe. 145 00:06:57,886 --> 00:07:00,510 Bạn không cần phải đưa nó đi cho đến khi Volkswagen phát hành một đợt thu hồi. 146 00:07:00,510 --> 00:07:02,509 Nhưng tại một số điểm chúng có lẽ sẽ phải 147 00:07:02,509 --> 00:07:04,230 để cập nhật các phần mềm bên trong xe của bạn. 148 00:07:04,230 --> 00:07:06,927 Khi điều đó xảy ra có lẽ bạn có được ít dặm mỗi thùng. 149 00:07:06,927 --> 00:07:09,260 Luật sư đã được chuẩn bị up cho các vụ kiện hành động lớp 150 00:07:09,260 --> 00:07:12,500 vì vậy các chủ thể được bồi thường tại một số thời điểm trong tương lai. 151 00:07:12,500 --> 00:07:15,832 Nhưng đó không phải đi tới xảy ra bất cứ lúc nào sớm. 152 00:07:15,832 --> 00:07:16,711 >> [END PLAYBACK] 153 00:07:16,711 --> 00:07:19,960 DAVID J. Malan: Vì vậy, đây thực sự đặt ra một câu hỏi thú vị bức tranh lớn hơn 154 00:07:19,960 --> 00:07:20,660 như để tin tưởng. 155 00:07:20,660 --> 00:07:21,160 Phải không? 156 00:07:21,160 --> 00:07:24,300 Tất cả chúng ta có iPhone hoặc Androids hay một cái gì đó trong túi của chúng tôi có khả năng nhất 157 00:07:24,300 --> 00:07:26,500 những ngày này, hoặc máy tính xách tay trên đùi của chúng tôi là 158 00:07:26,500 --> 00:07:28,510 chạy phần mềm được thực hiện bởi Apple và Microsoft 159 00:07:28,510 --> 00:07:30,710 và chùm của các công ty khác. 160 00:07:30,710 --> 00:07:34,240 Nhưng làm thế nào để chúng ta biết rằng những gì các sản phẩm phần mềm đang làm 161 00:07:34,240 --> 00:07:37,680 thực sự là những gì các công ty cho biết họ đang làm gì? 162 00:07:37,680 --> 00:07:39,610 >> Ví dụ, người để nói rằng mỗi khi bạn 163 00:07:39,610 --> 00:07:42,200 thực hiện cuộc gọi điện thoại trên iPhone của bạn hoặc điện thoại Android hoặc tương tự, 164 00:07:42,200 --> 00:07:45,650 đó là số điện thoại cũng không phải là được tải lên máy chủ một số công ty 165 00:07:45,650 --> 00:07:48,399 vì một số chương trình mà bạn đã bằng văn bản, cho dù đó là điều hành 166 00:07:48,399 --> 00:07:51,070 hệ thống chính nó như iOS hay Android, hoặc vì bạn đã tải về 167 00:07:51,070 --> 00:07:53,880 một số ứng dụng của bên thứ ba bằng cách nào đó đang lắng nghe 168 00:07:53,880 --> 00:07:57,120 để tất cả mọi thứ mà bạn đang nhập hoặc tất cả mọi thứ bạn đang thực sự nói. 169 00:07:57,120 --> 00:07:59,500 Làm thế nào để bạn biết rằng, khi các bạn đang chạy Clang 170 00:07:59,500 --> 00:08:02,590 hoặc Hãy để biên dịch của bạn phần mềm riêng trong CS50, làm thế nào 171 00:08:02,590 --> 00:08:06,080 bạn có nhân viên riêng của CS50 rằng, bằng cách của các thư viện CS50, 172 00:08:06,080 --> 00:08:08,690 đã không được đăng nhập mỗi chuỗi bạn đã bao giờ nhận được 173 00:08:08,690 --> 00:08:10,276 hoặc mỗi inch bạn đã bao giờ nhận được? 174 00:08:10,276 --> 00:08:12,900 Vâng, bạn chắc chắn có thể nhìn vào mã nguồn cho một cái gì đó 175 00:08:12,900 --> 00:08:15,233 như thư viện CS50, bạn có thể nhìn vào mã nguồn 176 00:08:15,233 --> 00:08:18,170 cho hệ điều hành Linux chạy trên CS50 IDE. 177 00:08:18,170 --> 00:08:23,090 Nhưng một bài thuyết trình tuyệt vời đã được đưa trở lại vào năm 1984 178 00:08:23,090 --> 00:08:26,730 trong khi nhận được giải thưởng Turing bởi một khoa học máy tính rất nổi tiếng được biết đến 179 00:08:26,730 --> 00:08:29,750 as-- tên là Ken Thompson người nhận được giải thưởng Turing mà 180 00:08:29,750 --> 00:08:33,500 là sắp xếp của khoa học máy tính Giải thưởng Nobel, nếu bạn muốn, 181 00:08:33,500 --> 00:08:35,309 cho công việc của mình trên một hệ điều hành được gọi là 182 00:08:35,309 --> 00:08:39,039 Unix, mà là rất tương tự như trong tinh thần với những gì chúng tôi sử dụng đó là Linux. 183 00:08:39,039 --> 00:08:41,960 Và câu hỏi anh hỏi của mình bài phát biểu chấp nhận, về cơ bản 184 00:08:41,960 --> 00:08:44,910 việc thiết lập những khuôn khổ cho năm và năm thảo luận 185 00:08:44,910 --> 00:08:46,970 về sự tin tưởng và an ninh có này. 186 00:08:46,970 --> 00:08:50,410 Đến mức độ nào nên một sự tin tưởng một tuyên bố rằng một program-- một mảnh 187 00:08:50,410 --> 00:08:53,010 của software-- là miễn phí của ngựa Trojan? 188 00:08:53,010 --> 00:08:56,500 Có lẽ điều quan trọng hơn để tin tưởng những người đã viết phần mềm. 189 00:08:56,500 --> 00:08:58,650 >> Và trên thực tế, chúng tôi đã liên kết để nói chuyện mà anh 190 00:08:58,650 --> 00:09:02,400 đã cho khi nhận giải thưởng này trong thập niên 80 trên trang web của CS50 191 00:09:02,400 --> 00:09:04,030 dưới các trang bài giảng cho ngày hôm nay. 192 00:09:04,030 --> 00:09:06,071 Bởi vì những gì bạn sẽ thấy là ông thực sự mang lại cho 193 00:09:06,071 --> 00:09:09,430 một ví dụ khá đơn giản về cách thậm chí một trình biên dịch như Clang hoặc bất cứ 194 00:09:09,430 --> 00:09:13,950 trình biên dịch khác đã được sử dụng trong quá khứ, nếu nhúng vào trong các trình biên dịch chúng tôi 195 00:09:13,950 --> 00:09:18,190 mình đang sử dụng là một chút nếu điều kiện mà chủ yếu nói, 196 00:09:18,190 --> 00:09:22,360 nếu bạn nhận thấy rằng mã này được sử dụng hàm GetString hoặc getInt 197 00:09:22,360 --> 00:09:26,600 chức năng, đi trước và chèn một cánh cửa trở lại hoặc Trojan horse 198 00:09:26,600 --> 00:09:29,340 như vậy mà chương trình đó hiện nay có một số số không 199 00:09:29,340 --> 00:09:30,930 và những người làm một cái gì đó độc hại. 200 00:09:30,930 --> 00:09:33,080 Đăng nhập tất cả các bạn tổ hợp phím, upload dữ liệu 201 00:09:33,080 --> 00:09:35,100 một số máy chủ, hoặc thực sự bất cứ điều gì. 202 00:09:35,100 --> 00:09:37,290 >> Và những gì Ken Thompson đi vào để làm trong bài nói chuyện của mình 203 00:09:37,290 --> 00:09:40,580 là để chứng minh rằng ngay cả khi bạn có quyền truy cập vào các nguồn 204 00:09:40,580 --> 00:09:43,794 mã của một trình biên dịch độc hại có thể làm điều này, 205 00:09:43,794 --> 00:09:46,210 nó không quan trọng vì có gà và trứng 206 00:09:46,210 --> 00:09:49,500 thực tế của nhiều qua năm, theo đó trình biên dịch 207 00:09:49,500 --> 00:09:51,960 được sử dụng để biên dịch tự. 208 00:09:51,960 --> 00:09:55,440 Nói cách khác, con đường trở lại khi một người nào đó đã phải có văn bản của trình biên dịch đầu tiên. 209 00:09:55,440 --> 00:09:59,060 Và sau đó, bất cứ lúc nào họ đã cập nhật một trình biên dịch bằng cách thay đổi mã nguồn của nó, 210 00:09:59,060 --> 00:10:02,020 thêm các tính năng và biên dịch lại nó cho những người như chúng ta sử dụng, tốt, 211 00:10:02,020 --> 00:10:04,270 họ đang sử dụng cũ phiên bản của trình biên dịch 212 00:10:04,270 --> 00:10:06,370 để biên dịch mới phiên bản của trình biên dịch. 213 00:10:06,370 --> 00:10:08,370 Và nếu bạn có một cái nhìn tại buổi nói chuyện đó, ông đã cho, 214 00:10:08,370 --> 00:10:10,970 bạn sẽ thấy rằng vì của tuần hoàn đó, 215 00:10:10,970 --> 00:10:14,330 bạn thực sự có thể có lỗi hoặc Ngựa Trojan nhúng trong phần mềm 216 00:10:14,330 --> 00:10:14,990 chúng ta đang sử dụng. 217 00:10:14,990 --> 00:10:18,010 Và thậm chí nếu bạn nhìn vào mã nguồn cho các chương trình, 218 00:10:18,010 --> 00:10:21,550 nó thậm chí có thể không rõ ràng vì những thủ đoạn gian trá là thực sự 219 00:10:21,550 --> 00:10:24,710 trong một số phiên bản cũ hơn của một trình biên dịch đó từ bao giờ đã được 220 00:10:24,710 --> 00:10:27,340 tiêm chích các mối đe dọa vào phần mềm của chúng tôi. 221 00:10:27,340 --> 00:10:29,740 >> Mà chỉ là để nói, chúng tôi thực sự không thể và không nên 222 00:10:29,740 --> 00:10:32,939 phần mềm tin tưởng chạy trên máy tính xách tay của chúng tôi hoặc điện thoại hoặc bất kỳ số nơi. 223 00:10:32,939 --> 00:10:36,230 Và trên thực tế, sau này trong học kỳ này khi chúng tôi bắt đầu nói về lập trình web 224 00:10:36,230 --> 00:10:38,521 và thực sự bắt đầu xây dựng các ứng dụng web mình, 225 00:10:38,521 --> 00:10:40,285 chúng ta sẽ nói về những các mối đe dọa và những người khác. 226 00:10:40,285 --> 00:10:43,410 Bây giờ, bạn có thể đã tự hỏi và nhận thấy rằng có một chút Darth nhỏ 227 00:10:43,410 --> 00:10:45,842 Vader trong clip The Verge đã được hiển thị ở đó 228 00:10:45,842 --> 00:10:47,550 về Volkswagen. Nếu bạn đã bao giờ nhìn thấy, tôi 229 00:10:47,550 --> 00:10:49,190 nghĩ chúng ta nên làm sáng tâm trạng vì đây là tất cả 230 00:10:49,190 --> 00:10:50,780 rất buồn và đáng sợ. 231 00:10:50,780 --> 00:10:52,910 Tôi sẽ nhìn lại tại Super Bowl 2011 232 00:10:52,910 --> 00:10:55,300 khi một thương mại bởi Volkswagen-- và điều này 233 00:10:55,300 --> 00:10:59,620 gần như làm cho họ đáng yêu again-- phát sóng lần đầu tiên trên truyền hình. 234 00:10:59,620 --> 00:11:04,039 Đó là clip thứ hai 60 mà tôi nghĩ rằng bạn sẽ thích thú. 235 00:11:04,039 --> 00:11:04,705 [VIDEO PLAYBACK] 236 00:11:04,705 --> 00:11:08,198 [MUSIC - THEME FROM "STAR WARS"] 237 00:11:08,198 --> 00:11:35,643 238 00:11:35,643 --> 00:11:38,138 [DOG sủa] 239 00:11:38,138 --> 00:11:50,114 240 00:11:50,114 --> 00:11:53,607 [CAR BẮT ĐẦU] 241 00:11:53,607 --> 00:12:04,086 242 00:12:04,086 --> 00:12:05,955 [END PLAYBACK] 243 00:12:05,955 --> 00:12:06,830 DAVID J. Malan: Yeah. 244 00:12:06,830 --> 00:12:07,663 Tôi đã chỉ kiểm tra. 245 00:12:07,663 --> 00:12:11,360 Xe đó là trên danh sách các hành vi vi phạm. 246 00:12:11,360 --> 00:12:12,000 Được rồi. 247 00:12:12,000 --> 00:12:14,040 Vì vậy, chúng ta xem xét một số giả một thời điểm trước đây. 248 00:12:14,040 --> 00:12:15,380 Và đây là một lớn hơn đoạn mã giả 249 00:12:15,380 --> 00:12:16,921 mà chúng tôi đã nhìn thấy một vài lần cho đến nay. 250 00:12:16,921 --> 00:12:19,970 Và chúng ta hãy sử dụng này là một cơ hội bây giờ để giới thiệu một chương trình mới 251 00:12:19,970 --> 00:12:23,776 kỹ thuật mà chúng tôi đã làm thấy thuật toán 252 00:12:23,776 --> 00:12:25,400 tuần trước khi chúng ta nhìn vào sắp xếp hợp nhất. 253 00:12:25,400 --> 00:12:28,270 Nhưng chúng ta hãy chính thức hóa nó và xem như thế nào chúng ta có thể sử dụng nó trong mã thực tế, 254 00:12:28,270 --> 00:12:30,350 và sau đó chúng ta sẽ sử dụng này kỹ thuật xuống đường nhất 255 00:12:30,350 --> 00:12:32,000 có khả năng để giải quyết một số vấn đề khác. 256 00:12:32,000 --> 00:12:35,790 >> Vì vậy, đây là một trong những chương trình đầu tiên của chúng tôi từng viết, mặc dù trong mã giả. 257 00:12:35,790 --> 00:12:37,790 Và những gì chương trình này cho phép chúng ta làm nhiên 258 00:12:37,790 --> 00:12:41,510 là tìm Mike Smith trong một cuốn sách điện thoại. 259 00:12:41,510 --> 00:12:46,216 Và thông báo trong dòng đặc biệt tám và 11 trong đó có tuyên bố Go To này. 260 00:12:46,216 --> 00:12:48,090 Và trên thực tế, nhất định ngôn ngữ, C trong đó, 261 00:12:48,090 --> 00:12:50,006 thực ra có một tuyên bố đó là nghĩa đen 262 00:12:50,006 --> 00:12:52,710 đi đến đó cho phép bạn nhảy đến một dòng cụ thể. 263 00:12:52,710 --> 00:12:55,470 Nó thường được tán thành bởi vì nó có thể được dễ dàng bị lạm dụng rất 264 00:12:55,470 --> 00:12:58,490 và bạn có thể bắt đầu nhảy của bạn chương trình trên tất cả các nơi như trái ngược 265 00:12:58,490 --> 00:13:00,690 để sử dụng các loại logic và điều khiển lưu lượng 266 00:13:00,690 --> 00:13:04,000 mà chúng ta đã sử dụng cho đến nay với chỉ mạch, điều kiện và muốn. 267 00:13:04,000 --> 00:13:08,660 >> Nhưng chúng ta có thể đơn giản hóa các thuật toán này trong mã giả như sau. 268 00:13:08,660 --> 00:13:11,250 Thay vì lặp đi lặp lại này hoặc looping cách tiếp cận 269 00:13:11,250 --> 00:13:14,160 nơi mà chúng tôi tiếp tục đi lại và trở lại và trở lại dòng ba, 270 00:13:14,160 --> 00:13:18,300 tại sao chúng ta không chỉ là loại đá trái banh và nhiều hơn nữa thường nói trong dòng bảy và 10, 271 00:13:18,300 --> 00:13:20,570 chỉ cần thay thế hai cặp dây chuyền với, 272 00:13:20,570 --> 00:13:22,810 else if Smith là trước đó trong cuốn sách chúng tôi sẽ 273 00:13:22,810 --> 00:13:25,110 tìm kiếm cho Mike trong nửa bên trái của cuốn sách. 274 00:13:25,110 --> 00:13:28,560 Khác nếu Smith là sau này trong cuốn sách, tìm cho Mike ở bên phải 275 00:13:28,560 --> 00:13:29,540 nửa cuốn sách. 276 00:13:29,540 --> 00:13:31,180 Và đã nhận thấy sự tuần hoàn. 277 00:13:31,180 --> 00:13:31,680 Phải không? 278 00:13:31,680 --> 00:13:34,250 Tôi đang tìm kiếm Mike ở các cuốn sách điện thoại và sau đó 279 00:13:34,250 --> 00:13:37,090 Cuối cùng tôi cũng có thể nhấn dòng bảy hoặc có thể dòng 10 280 00:13:37,090 --> 00:13:41,089 và hướng dẫn của tôi để bản thân mình là tìm kiếm cho Mike trong nửa của cuốn sách điện thoại. 281 00:13:41,089 --> 00:13:42,380 Vâng, làm thế nào để tôi tìm kiếm Mike? 282 00:13:42,380 --> 00:13:44,213 Tôi đang ở giữa tìm kiếm cho Mike, tại sao 283 00:13:44,213 --> 00:13:45,860 được bạn sắp xếp của tôi gửi trong một vòng tròn? 284 00:13:45,860 --> 00:13:49,590 Nhưng đó là OK, vì là những gì xảy ra với các kích thước của vấn đề, 285 00:13:49,590 --> 00:13:52,630 như được viết trong dòng 7 và 10? 286 00:13:52,630 --> 00:13:54,989 Chúng ta không chỉ nói tìm kiếm cho Mike, tìm cho Mike. 287 00:13:54,989 --> 00:13:56,280 Chúng ta đang nói cụ thể những gì? 288 00:13:56,280 --> 00:13:58,694 289 00:13:58,694 --> 00:14:01,610 Đi tìm anh ấy ở nửa trái của nửa bên phải mà là một cách hiệu quả 290 00:14:01,610 --> 00:14:03,440 một nửa kích thước của vấn đề. 291 00:14:03,440 --> 00:14:07,170 Vì vậy, nó là OK mà chúng ta đang loại tham gia vào tuần hoàn này, 292 00:14:07,170 --> 00:14:09,180 lập luận thông tư này, vì ít nhất chúng tôi 293 00:14:09,180 --> 00:14:11,090 làm cho vấn đề nhỏ hơn và nhỏ hơn. 294 00:14:11,090 --> 00:14:14,220 Và cuối cùng chúng ta sẽ đạt được rằng cái gọi là trường hợp cơ sở nơi 295 00:14:14,220 --> 00:14:16,780 chúng ta chỉ có một trang left-- là tình nguyện viên của chúng tôi tuần trước 296 00:14:16,780 --> 00:14:18,684 did-- chúng tôi đã có một trang trái và sau đó chúng tôi không 297 00:14:18,684 --> 00:14:21,600 phải tiếp tục tìm kiếm cho Mike Smith bởi vì ông là một trong hai trên trang đó 298 00:14:21,600 --> 00:14:23,080 hoặc anh ta không phải là. 299 00:14:23,080 --> 00:14:27,480 >> Vậy làm thế nào chúng ta có thể thực hiện ý tưởng này, này loại tuần hoàn trong mã thực tế? 300 00:14:27,480 --> 00:14:31,030 Vâng, chúng ta có thể tận dụng một kỹ thuật đó là thường được gọi là đệ quy. 301 00:14:31,030 --> 00:14:33,960 Và chúng tôi đã nhìn thấy điều này trong giả cho sắp xếp hợp nhất trong tuần qua. 302 00:14:33,960 --> 00:14:37,190 Nhớ lại rằng đây là giả cho sắp xếp hợp nhất. 303 00:14:37,190 --> 00:14:40,560 Nó cho rằng dù đơn giản hơn bong bóng, chọn lọc hoặc sắp xếp chèn 304 00:14:40,560 --> 00:14:43,310 chỉ về sự đơn giản mà bạn có thể thể hiện nó. 305 00:14:43,310 --> 00:14:46,750 >> Nhưng đó là vì chúng tôi loại tròn 306 00:14:46,750 --> 00:14:51,350 nói, tìm kiếm cái gì bằng cách tìm kiếm cho nó một lần nữa. 307 00:14:51,350 --> 00:14:53,960 Nhưng chúng tôi đang tìm kiếm hoặc nửa bên trái hoặc nửa bên phải 308 00:14:53,960 --> 00:14:56,070 và rồi cuối cùng chúng tôi sáp nhập trong trường hợp này. 309 00:14:56,070 --> 00:14:58,520 Nhưng ở đây, quá, với hai dòng sắp xếp, 310 00:14:58,520 --> 00:15:01,320 Chúng ta đã một lần nữa có này ý tưởng của đệ quy. 311 00:15:01,320 --> 00:15:05,350 Và cụ thể những gì này có nghĩa là, trong bối cảnh của một thuật toán, 312 00:15:05,350 --> 00:15:10,880 là một thuật toán đệ quy là nếu nó sử dụng hoặc gọi chính nó. 313 00:15:10,880 --> 00:15:14,330 >> Hoặc về C, một chức năng là recursive-- một chức năng gọi là 314 00:15:14,330 --> 00:15:18,510 foo là đệ quy nếu foo, một nơi nào đó trong mã nguồn của nó, 315 00:15:18,510 --> 00:15:21,250 gọi hàm foo chính nó. 316 00:15:21,250 --> 00:15:25,790 Và đó là xấu nếu tất cả foo từng làm là gọi chính nó một lần nữa và một lần nữa. 317 00:15:25,790 --> 00:15:30,600 Đó là OK nếu foo cuối cùng dừng lại, cũng như hợp nhất phân loại, bằng cách nói, chờ một phút, 318 00:15:30,600 --> 00:15:32,980 nếu vấn đề này là siêu nhỏ, ví dụ, 319 00:15:32,980 --> 00:15:35,840 hoặc tôi tìm thấy người mà tôi tìm kiếm, chỉ cần trả lại. 320 00:15:35,840 --> 00:15:41,000 Không đệ quy, không theo chu kỳ gọi bản thân mình một lần nữa. 321 00:15:41,000 --> 00:15:44,200 >> Và như vậy chúng ta hãy nhìn vào làm thế nào điều này có thể thực sự làm việc. 322 00:15:44,200 --> 00:15:48,430 Vì vậy, tôi sẽ đi trước và mở lên hai ví dụ mã nguồn ở đây. 323 00:15:48,430 --> 00:15:50,321 Một trong số đó được gọi là sigma 0. 324 00:15:50,321 --> 00:15:52,320 Và đây không phải là lúc tất cả đệ quy, nhưng chúng ta hãy 325 00:15:52,320 --> 00:15:53,694 một nhìn vào những gì chương trình này không. 326 00:15:53,694 --> 00:15:55,737 Tôi đã bị tước bỏ tất cả ý kiến ​​của nó, nhưng tất cả 327 00:15:55,737 --> 00:15:58,070 của mã nguồn trên CS50 của website có ý kiến ​​nếu bạn 328 00:15:58,070 --> 00:15:59,570 muốn đọc qua đọc lại nó sau. 329 00:15:59,570 --> 00:16:02,010 Và chúng ta hãy làm một vài của sự tỉnh táo kiểm tra ở đây. 330 00:16:02,010 --> 00:16:06,640 >> Vì vậy, ở trên cùng của mã này, chúng tôi có bao gồm CS50.h. 331 00:16:06,640 --> 00:16:07,650 Đang làm gì? 332 00:16:07,650 --> 00:16:08,990 Tại sao nó lại ở đây? 333 00:16:08,990 --> 00:16:11,740 Trong điều kiện của giáo lý của. 334 00:16:11,740 --> 00:16:12,424 Nó làm gì? 335 00:16:12,424 --> 00:16:12,858 Yeah. 336 00:16:12,858 --> 00:16:14,160 >> Đung Vì vậy mà getInt chức năng hoạt động. 337 00:16:14,160 --> 00:16:16,243 >> DAVID J. Malan: Vì vậy mà chức năng getInt hoạt động. 338 00:16:16,243 --> 00:16:18,115 Bởi vì bên trong này file, CS50.h, mà 339 00:16:18,115 --> 00:16:20,950 chúng ta sẽ thấy trước dài trong về mã nguồn của nó, 340 00:16:20,950 --> 00:16:23,270 có rất nhiều chức năng declared-- getInt, GetString, 341 00:16:23,270 --> 00:16:26,950 và một loạt các others-- và trừ chúng tôi thực sự có mà Bao gồm các dòng, 342 00:16:26,950 --> 00:16:29,320 các Clang trình biên dịch không phải là sẽ biết rằng nó tồn tại. 343 00:16:29,320 --> 00:16:32,400 Và cùng đi cho dòng hai nơi int được định nghĩa 344 00:16:32,400 --> 00:16:35,101 printf, mà là một chức năng chúng tôi tiếp tục sử dụng khá một chút. 345 00:16:35,101 --> 00:16:37,850 Bây giờ, dòng bốn vẻ như một chút sôi nổi bởi vì nó chỉ là một một lớp lót. 346 00:16:37,850 --> 00:16:41,570 Nó có một dấu chấm phẩy, không xoăn niềng răng, không có mã bên trong của nó. 347 00:16:41,570 --> 00:16:44,640 Nhưng những gì đã làm chúng ta gọi điều này trong tuần qua? 348 00:16:44,640 --> 00:16:45,140 Yeah. 349 00:16:45,140 --> 00:16:46,060 Vì vậy, một nguyên mẫu. 350 00:16:46,060 --> 00:16:48,390 Và tại sao chúng ta có một nguyên mẫu mà dường 351 00:16:48,390 --> 00:16:51,050 có một chút dư thừa thường bởi vì chúng ta thường 352 00:16:51,050 --> 00:16:53,474 xem các chức năng một lần nữa sau này trong các tập tin, phải không? 353 00:16:53,474 --> 00:16:56,390 Vì vậy, tại sao chúng ta have-- bạn chỉ gãi đầu của bạn nhưng tôi sẽ lấy nó. 354 00:16:56,390 --> 00:16:57,302 Yeah. 355 00:16:57,302 --> 00:17:00,000 >> Đung [Không nghe thấy] chức năng sau khi chính. 356 00:17:00,000 --> 00:17:01,000 DAVID J. Malan: Chính xác. 357 00:17:01,000 --> 00:17:04,089 Vì vậy mà các trình biên dịch biết bạn cuối cùng sẽ xác định hoặc thực hiện 358 00:17:04,089 --> 00:17:06,579 mà chức năng chính sau, có lẽ. 359 00:17:06,579 --> 00:17:08,462 Vì vậy Clang và nhất trình biên dịch là những loại câm 360 00:17:08,462 --> 00:17:10,510 và họ sẽ chỉ biết những gì bạn nói với họ. 361 00:17:10,510 --> 00:17:12,569 Và nếu bạn muốn sử dụng một chức năng gọi là sigma, 362 00:17:12,569 --> 00:17:15,710 bạn tốt hơn dạy cho các trình biên dịch rằng nó tồn tại trước. 363 00:17:15,710 --> 00:17:17,970 >> Bây giờ, bản thân chính, thậm chí mặc dù đó là một loạt các đường dây, 364 00:17:17,970 --> 00:17:19,839 là khá quen thuộc hy vọng bây giờ. 365 00:17:19,839 --> 00:17:21,942 Nó có một việc phải làm trong khi vòng lặp mục đích mà trong cuộc sống 366 00:17:21,942 --> 00:17:24,400 đây rõ ràng là để có được một số nguyên dương từ người sử dụng. 367 00:17:24,400 --> 00:17:27,349 Và chỉ cần giữ làm phiền anh hoặc cô cho đến khi họ hợp tác. 368 00:17:27,349 --> 00:17:30,670 Sau đó, trong dòng 16 Tôi có một cuộc gọi thú vị. 369 00:17:30,670 --> 00:17:31,570 IntAnswer. 370 00:17:31,570 --> 00:17:33,710 Mà mặt trái bên mang lại cho tôi một Int 371 00:17:33,710 --> 00:17:36,650 mà có thể gọi là Answer-- store-- đó là sẽ lưu, rõ ràng, 372 00:17:36,650 --> 00:17:39,090 giá trị trả về của sigma. 373 00:17:39,090 --> 00:17:41,840 Vì vậy, sigma chỉ là một tên tùy ý nhưng đầy ý nghĩa 374 00:17:41,840 --> 00:17:44,500 mà tôi đã trao cho một chức năng mục đích mà trong cuộc sống 375 00:17:44,500 --> 00:17:47,680 là để có một argument-- chúng tôi sẽ gọi nó là N trong case-- này 376 00:17:47,680 --> 00:17:52,280 và chỉ để lấy tổng của số đó cộng với mỗi số dương đó là 377 00:17:52,280 --> 00:17:53,200 nhỏ hơn nó. 378 00:17:53,200 --> 00:17:58,140 >> Vì vậy, nếu tôi vượt qua trong số 2 sigma, tôi muốn thêm 2 cộng 1 379 00:17:58,140 --> 00:18:00,240 cộng 0-- không 0-- để mang lại cho tôi 3. 380 00:18:00,240 --> 00:18:05,320 Nếu tôi vượt qua trong 3 đến sigma, tôi muốn có 3 cộng với 2 cộng với 1, mà mang lại cho tôi 6. 381 00:18:05,320 --> 00:18:05,900 Và kể từ đó trở đi. 382 00:18:05,900 --> 00:18:09,750 Vì vậy, nó chỉ cần thêm lên tất cả các con số nhỏ hơn hoặc bằng với nó. 383 00:18:09,750 --> 00:18:12,040 >> Bây giờ, xuống đây tôi chỉ cần đi để in ra các câu trả lời. 384 00:18:12,040 --> 00:18:17,330 Vì vậy, như một kiểm tra sự tỉnh táo nhanh chóng, chúng ta hãy làm cho sigma 0-- dot slash sigma 0-- 385 00:18:17,330 --> 00:18:18,690 và cho tôi gõ 2. 386 00:18:18,690 --> 00:18:19,960 Và tôi thực sự có được 3. 387 00:18:19,960 --> 00:18:21,240 Hãy để tôi gõ vào 3. 388 00:18:21,240 --> 00:18:22,860 Tôi thực sự nhận được 6. 389 00:18:22,860 --> 00:18:27,636 Và nếu có ai có thể làm toán nhanh chóng, nếu tôi làm 50 giờ tôi sẽ nhận được? 390 00:18:27,636 --> 00:18:29,839 >> Đung [không nghe được]. 391 00:18:29,839 --> 00:18:30,880 DAVID J. Malan: Vâng, không có. 392 00:18:30,880 --> 00:18:33,340 Nhưng 1.275 mà là khá gần. 393 00:18:33,340 --> 00:18:38,850 Vì vậy, đây là kết quả của việc 50 cộng với 49 cộng với 48 cộng với 47 cộng với 46 394 00:18:38,850 --> 00:18:40,349 tất cả các con đường xuống 1. 395 00:18:40,349 --> 00:18:41,390 Vì vậy, đó là tất cả sigma không. 396 00:18:41,390 --> 00:18:43,350 Nhưng chúng ta hãy xem làm thế nào chúng tôi đã thực hiện nó ngay bây giờ. 397 00:18:43,350 --> 00:18:45,790 Vì vậy, xuống đây là chức năng riêng của mình. 398 00:18:45,790 --> 00:18:49,000 Và điều này dường như không có bất cứ điều gì để làm với đệ quy nào. 399 00:18:49,000 --> 00:18:51,070 Trong thực tế, chúng tôi đang sử dụng một kỹ thuật trường học cũ. 400 00:18:51,070 --> 00:18:56,680 Tôi đang khởi tạo một biến gọi là tiền bằng không, sau đó tôi có một foreloop đây, 401 00:18:56,680 --> 00:19:00,790 và tôi tuyên bố một Int gọi Tôi, đặt nó bằng với 1-- 402 00:19:00,790 --> 00:19:04,080 mặc dù tôi có thể thiết lập nó bằng bằng không, nhưng kể từ khi tôi đang làm Ngoài ra, 403 00:19:04,080 --> 00:19:05,340 người quan tâm nếu nó không hay một. 404 00:19:05,340 --> 00:19:06,660 Nó sẽ không có hiệu lực. 405 00:19:06,660 --> 00:19:10,110 >> Vì vậy, tôi lặp chừng nào tôi còn là ít hơn hoặc bằng m, trong đó 406 00:19:10,110 --> 00:19:11,671 là tham số được truyền vào. 407 00:19:11,671 --> 00:19:13,670 Và sau đó tôi chỉ giữ incrementing I. Và cái nhìn sâu sắc 408 00:19:13,670 --> 00:19:20,010 của vòng lặp tất cả tôi đang làm là làm tiền cộng bằng I. Và đó là có chủ ý. 409 00:19:20,010 --> 00:19:22,326 Tôi không muốn làm, trong này trường hợp, như tổng cộng cộng. 410 00:19:22,326 --> 00:19:24,790 Tôi muốn thực sự thêm giá trị hiện tại của tôi 411 00:19:24,790 --> 00:19:28,190 mà giữ nhận được lớn hơn và lớn hơn và lớn hơn để kiểm đếm chạy. 412 00:19:28,190 --> 00:19:30,210 >> Và sau đó tôi trở về sum. 413 00:19:30,210 --> 00:19:33,850 Và như vậy câu trả lời nhận được tổng giá trị. 414 00:19:33,850 --> 00:19:35,282 Và sau đó tôi in nó ra. 415 00:19:35,282 --> 00:19:37,740 Vì vậy, có một cơ hội ở đây, tuy nhiên, để loại đơn giản hóa 416 00:19:37,740 --> 00:19:41,260 mã này khái niệm và các loại đòn một là 417 00:19:41,260 --> 00:19:43,250 tâm trong điều khoản của đơn giản mặc dù nó 418 00:19:43,250 --> 00:19:45,700 mất một thời gian để sắp xếp của đánh giá cao tại sao điều này 419 00:19:45,700 --> 00:19:47,330 là mạnh mẽ trong những ví dụ nhỏ. 420 00:19:47,330 --> 00:19:50,380 Dưới đây là sigma one-- nên phiên bản thứ hai của mã này. 421 00:19:50,380 --> 00:19:55,290 Tất cả mọi thứ lên đầu giống hệt như vậy cùng câu chuyện áp dụng như trước. 422 00:19:55,290 --> 00:19:59,220 Nhưng bây giờ chúng ta hãy nhìn vào thực hiện sigma mà 423 00:19:59,220 --> 00:20:05,040 Tôi đã chọn ra để chỉ những lines-- bốn dòng mã, thực sự, 424 00:20:05,040 --> 00:20:06,980 cộng thêm một số dấu ngoặc nhọn và không gian màu trắng. 425 00:20:06,980 --> 00:20:07,930 >> Nhưng những gì tôi làm? 426 00:20:07,930 --> 00:20:11,050 Nếu m là ít hơn hoặc bằng bằng không, tôi cần phải loại xử lý 427 00:20:11,050 --> 00:20:12,490 rằng trường hợp siêu đơn giản. 428 00:20:12,490 --> 00:20:15,450 Và nếu bạn đưa cho tôi không hay bất cứ điều gì tiêu cực mà chỉ là kỳ lạ, 429 00:20:15,450 --> 00:20:17,909 Tôi chỉ cần đi để tùy tiện nhưng luôn trở về zero. 430 00:20:17,909 --> 00:20:20,200 Tôi không muốn điều này để nhận được vào một số vô hạn kỳ lạ 431 00:20:20,200 --> 00:20:21,810 loop vì một giá trị âm. 432 00:20:21,810 --> 00:20:25,070 Vì vậy, tôi chỉ nói rằng, nếu bạn cho tôi không hoặc ít hơn, tôi đang trở về zero. 433 00:20:25,070 --> 00:20:28,220 >> Nhưng đó là tốt bởi vì đó là rằng trang duy nhất của cuốn sách điện thoại 434 00:20:28,220 --> 00:20:28,790 những gì còn lại. 435 00:20:28,790 --> 00:20:32,660 Tôi cắn ra một vấn đề rất cụ thể và không một cái gì đó gọi đệ quy. 436 00:20:32,660 --> 00:20:36,580 Nhưng trong dòng 31, những gì Tôi dường như đang làm? 437 00:20:36,580 --> 00:20:39,780 Các dấu ngoặc đơn chỉ giữ điều, hy vọng, một chút rõ ràng hơn. 438 00:20:39,780 --> 00:20:42,110 Nhưng tất cả tôi đang làm là tôi trở m-- bất cứ điều gì 439 00:20:42,110 --> 00:20:45,790 bạn tay me-- cộng với giá trị của m-- xin lỗi, 440 00:20:45,790 --> 00:20:49,052 cộng với giá trị của sigma của m trừ đi 1. 441 00:20:49,052 --> 00:20:50,010 Vì vậy, điều này có nghĩa là gì? 442 00:20:50,010 --> 00:20:53,965 Nếu bạn cung cấp cho tôi số 3 như đầu vào, câu trả lời tôi muốn nhận được cuối cùng 443 00:20:53,965 --> 00:20:57,307 6 vì 3 cộng với 2 cộng với 1 mang lại cho tôi 6. 444 00:20:57,307 --> 00:20:59,390 Nhưng làm thế nào để tôi suy nghĩ về làm thế nào mã này được chạy? 445 00:20:59,390 --> 00:21:03,070 Lần đầu tiên tôi gọi sigma và tôi vượt qua trong các giá trị 3, 446 00:21:03,070 --> 00:21:07,960 mà giống như đang nói về một mảnh giấy, đây là giá trị 3 447 00:21:07,960 --> 00:21:09,920 và tôi đã được thông qua này như sigma. 448 00:21:09,920 --> 00:21:13,090 3 rõ ràng là không nhỏ hơn 0 nên điều kiện IF không áp dụng. 449 00:21:13,090 --> 00:21:14,020 Các ELSE không. 450 00:21:14,020 --> 00:21:14,990 Vì vậy, tôi phải làm gì? 451 00:21:14,990 --> 00:21:19,902 Tôi muốn trở lại m, đó là 3, cộng với sigma của m trừ đi 1. 452 00:21:19,902 --> 00:21:21,110 Vì vậy, hãy để tôi theo dõi này. 453 00:21:21,110 --> 00:21:22,710 Tôi sẽ đặt này mảnh giấy xuống. 454 00:21:22,710 --> 00:21:24,668 Và những gì giá trị, để được rõ ràng, tôi sẽ vượt qua 455 00:21:24,668 --> 00:21:26,540 vào sigma vào thời điểm này trong câu chuyện? 456 00:21:26,540 --> 00:21:28,080 Số gì? 457 00:21:28,080 --> 00:21:28,610 2, phải không? 458 00:21:28,610 --> 00:21:29,670 3 trừ đi 1 là 2. 459 00:21:29,670 --> 00:21:32,000 Vì vậy, tôi chỉ cần một chút phế liệu giấy ở đây. 460 00:21:32,000 --> 00:21:33,931 Vì vậy bây giờ sigma là nhận được gọi một lần nữa. 461 00:21:33,931 --> 00:21:35,930 Và tôi đã cố tình đặt xuống này bởi vì nó 462 00:21:35,930 --> 00:21:38,070 loại giống như tạm dừng là phiên bản của câu chuyện 463 00:21:38,070 --> 00:21:40,720 vì bây giờ tôi đang tập trung trên tín hiệu của m trừ đi 1. 464 00:21:40,720 --> 00:21:42,660 Vì vậy, m là 3, m trừ đi 1 là 2. 465 00:21:42,660 --> 00:21:45,110 Vì vậy, đây là 2 mà tôi đã được thông qua. 466 00:21:45,110 --> 00:21:48,510 2 rõ ràng là không ít hơn 0 để trường hợp đó không áp dụng. 467 00:21:48,510 --> 00:21:53,445 Else tôi trở về m, mà là này điều, cộng với sigma của những gì giá trị? 468 00:21:53,445 --> 00:21:56,160 469 00:21:56,160 --> 00:21:59,650 Vì vậy, nếu sigma của 1-- vì m là ngay bây giờ 2 để 2 trừ 1 là 1. 470 00:21:59,650 --> 00:22:01,950 Vì vậy, bây giờ tôi chỉ có giá trị 1. 471 00:22:01,950 --> 00:22:04,810 Tôi đang đi qua chỉ số 1 cho chức năng sigma-- 472 00:22:04,810 --> 00:22:09,120 hoặc bản thân mình here-- so 1 là rõ ràng không ít hơn số không, vẫn không áp dụng. 473 00:22:09,120 --> 00:22:12,970 >> Trở lại khác 1 cộng sigma của những gì? 474 00:22:12,970 --> 00:22:13,470 0. 475 00:22:13,470 --> 00:22:14,678 Vì vậy, hãy để tôi chỉ cần nhớ rằng. 476 00:22:14,678 --> 00:22:15,920 Tôi sẽ lấy lại cho rằng sau này. 477 00:22:15,920 --> 00:22:18,060 Bây giờ tôi sẽ đi trước và jot xuống số 0 bởi vì đó là 478 00:22:18,060 --> 00:22:19,470 đối số hoặc tham số của tôi. 479 00:22:19,470 --> 00:22:22,400 Tôi đã thông qua các số 0 và cuối cùng là quá trình này 480 00:22:22,400 --> 00:22:25,760 chỉ lặp đi lặp lại bản thân mình quảng cáo nauseum không ngừng lại bởi vì những gì 481 00:22:25,760 --> 00:22:28,820 Tôi ngay lập tức làm một lần tôi thấy 0 này? 482 00:22:28,820 --> 00:22:29,790 Tôi trở về zero. 483 00:22:29,790 --> 00:22:31,790 Vì vậy, bây giờ bạn phải tua lại câu chuyện. 484 00:22:31,790 --> 00:22:34,430 >> Nếu bây giờ tôi đi ngược trở lại trong thời gian, những gì đã là điều gần đây nhất 485 00:22:34,430 --> 00:22:36,670 Tôi đã làm nếu bạn là nghĩa đen tua một video? 486 00:22:36,670 --> 00:22:41,630 Tôi sẽ nhận gần đây nhất 1 và mang lại cho tôi 1 cộng với 0 là 1. 487 00:22:41,630 --> 00:22:44,100 Nếu tôi tiếp tục tua sự câu chuyện, đó là sẽ cho tôi 488 00:22:44,100 --> 00:22:46,880 2 cộng với giá trị chạy này, đó là 1. 489 00:22:46,880 --> 00:22:47,789 Vì vậy, đó là 3. 490 00:22:47,789 --> 00:22:49,330 Và sau đó tôi sẽ giữ tua. 491 00:22:49,330 --> 00:22:54,220 Khi lần đầu tiên tôi đặt xuống số 3-- so 3 cộng với 3 mang lại cho tôi 6. 492 00:22:54,220 --> 00:22:57,272 >> Và bây giờ, nếu bạn đã rewound video cho đến thời điểm này, 493 00:22:57,272 --> 00:22:58,980 này là rất Câu hỏi đầu tiên tôi hỏi. 494 00:22:58,980 --> 00:23:01,450 Khi thông qua 3, sigma 3 là gì? 495 00:23:01,450 --> 00:23:04,204 Nó thực sự 6, tổng của tất cả các mảnh giấy. 496 00:23:04,204 --> 00:23:07,120 Vì vậy, nếu mà phải mất một chút thời gian để hết tâm trí bạn, đó là tốt. 497 00:23:07,120 --> 00:23:10,700 Nhưng xem xét đó là một little-- nó đã rất cố ý mà tôi xếp chồng lên nhau 498 00:23:10,700 --> 00:23:12,990 những con số trên đầu trang của mỗi khác. 499 00:23:12,990 --> 00:23:17,440 Đó là loại giống như có một memory-- một kỷ lục trong thời gian, 500 00:23:17,440 --> 00:23:19,940 như một chà sàn trong một video, mà tôi thực sự có thể tua lại trong. 501 00:23:19,940 --> 00:23:24,350 Và chúng ta sẽ quay trở lại rằng ẩn dụ trong chỉ một chút. 502 00:23:24,350 --> 00:23:28,240 >> Nhưng trước tiên, nó quay ra rằng có rất nhiều chuyên viên máy tính và người funny, 503 00:23:28,240 --> 00:23:29,614 Tôi đoán, tại Google. 504 00:23:29,614 --> 00:23:31,530 Sẽ một người rất giỏi Googling tâm 505 00:23:31,530 --> 00:23:34,270 sắp lên một lát và giúp tôi tìm kiếm một cái gì đó? 506 00:23:34,270 --> 00:23:35,650 Rất, trọng rất thấp. 507 00:23:35,650 --> 00:23:37,870 Một người không bao giờ đi lên trước, có lẽ. 508 00:23:37,870 --> 00:23:38,370 ĐƯỢC. 509 00:23:38,370 --> 00:23:39,030 Yeah? 510 00:23:39,030 --> 00:23:39,530 Thôi nào. 511 00:23:39,530 --> 00:23:41,410 Come on xuống. 512 00:23:41,410 --> 00:23:42,183 Tên bạn là gì? 513 00:23:42,183 --> 00:23:42,870 >> SAM: Sam. 514 00:23:42,870 --> 00:23:44,290 >> DAVID J. Malan: Sam, đến trên xuống. 515 00:23:44,290 --> 00:23:45,320 Điều này là tương tự. 516 00:23:45,320 --> 00:23:46,280 Rất hân hạnh được biết bạn. 517 00:23:46,280 --> 00:23:46,780 Chào. 518 00:23:46,780 --> 00:23:47,580 Đến ngày qua. 519 00:23:47,580 --> 00:23:51,290 Vì vậy, tất cả tôi cần bạn làm, nếu bạn có thể, Sam, đây là Google. 520 00:23:51,290 --> 00:23:53,240 Bạn có thể tìm kiếm đệ quy hạn? 521 00:23:53,240 --> 00:23:55,770 522 00:23:55,770 --> 00:23:56,270 Đừng làm hỏng. 523 00:23:56,270 --> 00:23:59,940 524 00:23:59,940 --> 00:24:00,970 >> Và bây giờ let's-- yeah. 525 00:24:00,970 --> 00:24:03,380 Nhấn OK mà. 526 00:24:03,380 --> 00:24:04,315 Better bấm vào đó. 527 00:24:04,315 --> 00:24:07,020 528 00:24:07,020 --> 00:24:08,020 Ahh, có được nó. 529 00:24:08,020 --> 00:24:08,520 Không có? 530 00:24:08,520 --> 00:24:09,050 ĐƯỢC. 531 00:24:09,050 --> 00:24:10,430 Vì vậy, chúng ta hãy làm một vài người khác. 532 00:24:10,430 --> 00:24:12,830 Không quá nhiều liên quan học tập ở đây, nhưng có bạn 533 00:24:12,830 --> 00:24:14,520 từng tìm kiếm Google cho phép đảo chữ? 534 00:24:14,520 --> 00:24:15,280 >> SAM: No. 535 00:24:15,280 --> 00:24:15,520 >> DAVID J. Malan: OK. 536 00:24:15,520 --> 00:24:17,186 Tìm kiếm đảo chữ thay vì đệ quy. 537 00:24:17,186 --> 00:24:22,540 538 00:24:22,540 --> 00:24:23,790 Làm thế nào về lệch. 539 00:24:23,790 --> 00:24:25,515 Bạn bao giờ tìm kiếm lệch? 540 00:24:25,515 --> 00:24:29,260 541 00:24:29,260 --> 00:24:32,692 Bây giờ, con này hơi khó nhìn thấy, nhưng hy vọng everything's-- OK. 542 00:24:32,692 --> 00:24:34,150 Nó chỉ là bạn và tôi thưởng thức này. 543 00:24:34,150 --> 00:24:34,690 ĐƯỢC. 544 00:24:34,690 --> 00:24:38,950 >> Vì vậy, cuối cùng, one's-- này đó là một chút lệch. 545 00:24:38,950 --> 00:24:40,810 Bây giờ làm một cuộn thùng. 546 00:24:40,810 --> 00:24:44,460 547 00:24:44,460 --> 00:24:45,310 Quá tuyệt vời. 548 00:24:45,310 --> 00:24:45,910 Được rồi. 549 00:24:45,910 --> 00:24:47,110 Big Sam cảm ơn bạn. 550 00:24:47,110 --> 00:24:49,416 Ở đây bạn đi. 551 00:24:49,416 --> 00:24:50,400 Cảm ơn. 552 00:24:50,400 --> 00:24:52,807 >> Vì vậy, những gì đang xảy ra ở tất cả các Những ví dụ ngớ ngẩn? 553 00:24:52,807 --> 00:24:55,640 Vì vậy, thực sự, bên dưới mui xe của Hàng triệu dòng mã của Google 554 00:24:55,640 --> 00:24:58,860 rõ ràng là một vài ngớ ngẩn IF điều kiện vật chất cơ bản 555 00:24:58,860 --> 00:25:01,160 kiểm tra xem người dùng có gõ vào cụm từ này, 556 00:25:01,160 --> 00:25:03,760 làm một cái gì đó mà có lẽ mất một số lượng không tầm thường của thời gian 557 00:25:03,760 --> 00:25:06,080 để thực hiện chỉ để được vui theo cách này. 558 00:25:06,080 --> 00:25:08,430 Nhưng đó là tất cả nó nắm xuống dưới mui xe. 559 00:25:08,430 --> 00:25:11,570 Nhưng, tất nhiên, đệ quy là chi tiết của các geekier 560 00:25:11,570 --> 00:25:13,880 Ví dụ trong số những thủ thuật đặc biệt. 561 00:25:13,880 --> 00:25:16,880 Và chắc chắn có những người khác ra khỏi đó cũng là chúng ta có lẽ có thậm chí không 562 00:25:16,880 --> 00:25:18,230 phát hiện ra chỉ được nêu ra. 563 00:25:18,230 --> 00:25:22,830 >> Vì vậy, hãy xem, hoặc xem xét bây giờ các chương trình sau đây, 564 00:25:22,830 --> 00:25:24,830 và chắc chắn lấy bất kỳ trong số này trên đường hết. 565 00:25:24,830 --> 00:25:28,820 Tôi sẽ đi trước và mở ra một chương trình đó là 566 00:25:28,820 --> 00:25:30,920 sẽ cố gắng để trao đổi hai giá trị. 567 00:25:30,920 --> 00:25:33,210 Nhưng trước khi chúng ta đi đến đó, chúng ta hãy làm điều này. 568 00:25:33,210 --> 00:25:38,500 Chúng ta có thể nhận được thêm một tình nguyện viên, tôi nghĩ? 569 00:25:38,500 --> 00:25:40,480 Bạn có muốn làm tình nguyện? 570 00:25:40,480 --> 00:25:40,980 Không có? 571 00:25:40,980 --> 00:25:41,890 Nào lên. 572 00:25:41,890 --> 00:25:42,390 Nào lên. 573 00:25:42,390 --> 00:25:42,890 Được rồi. 574 00:25:42,890 --> 00:25:44,136 Vì vậy, tên của bạn là gì? 575 00:25:44,136 --> 00:25:44,810 >> Lauren: Lauren. 576 00:25:44,810 --> 00:25:45,768 >> DAVID J. Malan: Lauren. 577 00:25:45,768 --> 00:25:46,890 Nào lên, Lauren. 578 00:25:46,890 --> 00:25:50,140 Vì vậy, Lauren đang được thách thức ở đây như sau. 579 00:25:50,140 --> 00:25:52,310 Rất hân hạnh được biết bạn. 580 00:25:52,310 --> 00:25:55,730 Vì vậy, ở đây có Lauren trước của hai cốc rỗng của cô. 581 00:25:55,730 --> 00:25:57,570 Và chúng tôi có một số cam nước trái cây và một ít sữa 582 00:25:57,570 --> 00:26:00,301 và chúng ta sẽ đi trước và làm như sau. 583 00:26:00,301 --> 00:26:01,550 Chúng tôi chỉ cần đi để điền này. 584 00:26:01,550 --> 00:26:07,840 Một vài ounces sữa trên đây và chúng ta hãy điền vào một nước cam ít hơn ở đây. 585 00:26:07,840 --> 00:26:11,475 >> Và phía trước của tất cả các các khán giả, 586 00:26:11,475 --> 00:26:13,550 trao đổi hai giá trị của những ly. 587 00:26:13,550 --> 00:26:16,970 Đặt nước cam vào cốc sữa và sữa trong cốc nước cam. 588 00:26:16,970 --> 00:26:22,380 589 00:26:22,380 --> 00:26:26,150 Làm thế nào bạn sẽ làm điều này nếu bạn đang ở nhà và được tiếp cận với nguồn cung cấp khác? 590 00:26:26,150 --> 00:26:27,400 Lauren: Đặt nó trong cốc khác. 591 00:26:27,400 --> 00:26:28,191 DAVID J. Malan: OK. 592 00:26:28,191 --> 00:26:31,940 Vì vậy, chúng ta hãy có một tạm thời biến, nếu chúng tôi sẽ. 593 00:26:31,940 --> 00:26:35,871 Và đi trước bây giờ và thực hiện thủ tục trao đổi cùng này. 594 00:26:35,871 --> 00:26:36,370 Vì vậy, tốt. 595 00:26:36,370 --> 00:26:41,490 Chúng tôi đã đặt OJ vào tạm thời biến, sữa vào biến OJ, 596 00:26:41,490 --> 00:26:44,481 và bây giờ các biến tạm thời vào biến sữa. 597 00:26:44,481 --> 00:26:44,980 ĐƯỢC. 598 00:26:44,980 --> 00:26:48,740 Vì vậy, thực hiện rất tốt cho đến nay. 599 00:26:48,740 --> 00:26:50,990 Vì vậy, nó quay out-- giữ mà suy nghĩ một lát. 600 00:26:50,990 --> 00:26:54,479 Ở đây, để chỉ geek nó lên một chút, điều này sẽ là mã C tương ứng 601 00:26:54,479 --> 00:26:55,520 mà chúng ta vừa thực hiện. 602 00:26:55,520 --> 00:26:58,650 Chúng tôi đã có hai đầu vào, a và b, cả hai mà chúng tôi sẽ chỉ nói cho đơn giản là 603 00:26:58,650 --> 00:26:59,260 int của. 604 00:26:59,260 --> 00:27:02,780 Và hãy chú ý ở đây, nếu tôi muốn trao đổi các giá trị của hai biến a và b, 605 00:27:02,780 --> 00:27:06,890 chúng tôi thực sự cần một người trung gian, một biến tạm thời, một cốc tạm thời, 606 00:27:06,890 --> 00:27:10,830 vào đó đổ một trong những giá trị để chúng tôi có một giữ chỗ cho nó. 607 00:27:10,830 --> 00:27:13,480 Nhưng sau đó mã là chính xác như Lauren ở đây thực hiện. 608 00:27:13,480 --> 00:27:15,500 >> Bây giờ, chỉ để có được một chút điên, hóa ra 609 00:27:15,500 --> 00:27:20,930 mà bạn có thể làm điều này mà không cần một biến tạm thời. 610 00:27:20,930 --> 00:27:24,870 Để làm điều này đúng, tuy nhiên, chúng ta đang đi phải ăn gian với một số chất hóa học. 611 00:27:24,870 --> 00:27:26,380 Chúng tôi có một số chén thêm ở đây. 612 00:27:26,380 --> 00:27:29,600 Vì vậy, những điều gần gũi nhất mà trông như sữa và nước perhaps-- 613 00:27:29,600 --> 00:27:34,090 hoặc sữa và OJ-- là chúng tôi có một số nước, vì vậy chúng tôi sẽ điền này lên 614 00:27:34,090 --> 00:27:36,486 với một vài ounces nước trong. 615 00:27:36,486 --> 00:27:38,332 Đó có thể là quá nhiều. 616 00:27:38,332 --> 00:27:38,832 Yeah. 617 00:27:38,832 --> 00:27:39,934 Đó chắc chắn là quá nhiều. 618 00:27:39,934 --> 00:27:40,600 Giữ trên một giây. 619 00:27:40,600 --> 00:27:43,520 620 00:27:43,520 --> 00:27:48,420 >> Và bây giờ chúng ta có dầu, trong đó, khi tôi gọi lại từ tầng lớp trung lưu hóa học, 621 00:27:48,420 --> 00:27:49,990 hy vọng nó không kết hợp với nước. 622 00:27:49,990 --> 00:27:53,650 Nhưng nó loại loại trông giống như sữa và OJ. 623 00:27:53,650 --> 00:27:55,760 Vì vậy, bây giờ, mà không sử dụng một biến tạm thời, 624 00:27:55,760 --> 00:27:59,260 bạn có thể trao đổi những hai giá trị? 625 00:27:59,260 --> 00:28:03,884 Vì vậy, dầu đi vào cốc nước, nước đi vào cốc dầu. 626 00:28:03,884 --> 00:28:04,800 Lauren: Không ly khác? 627 00:28:04,800 --> 00:28:05,940 DAVID J. Malan: Không ly khác. 628 00:28:05,940 --> 00:28:07,860 Và tôi đã không thực sự được thử nghiệm này trước khi năm nay 629 00:28:07,860 --> 00:28:10,110 vì vậy tôi không biết nếu điều này sẽ thực sự làm việc về mặt hóa học. 630 00:28:10,110 --> 00:28:16,130 631 00:28:16,130 --> 00:28:18,650 Đó không phải là mong muốn xảy ra. 632 00:28:18,650 --> 00:28:19,761 Nó có đang làm việc không? 633 00:28:19,761 --> 00:28:20,260 Được rồi. 634 00:28:20,260 --> 00:28:20,990 Vì vậy, tách? 635 00:28:20,990 --> 00:28:21,490 Tốt. 636 00:28:21,490 --> 00:28:24,714 Bây giờ chúng tôi có để có được nước vào cốc khác. 637 00:28:24,714 --> 00:28:27,630 Bộ tập trung hóa học thông minh hơn có thể có thể làm điều này tốt hơn tôi. 638 00:28:27,630 --> 00:28:28,510 >> Lauren: Nước là ở phía dưới. 639 00:28:28,510 --> 00:28:31,910 >> DAVID J. Malan: Các water-- đó là những gì là quan trọng thời gian qua chúng tôi đã làm điều này. 640 00:28:31,910 --> 00:28:33,950 Bạn phải làm điều đó theo thứ tự đúng. 641 00:28:33,950 --> 00:28:34,450 Yeah. 642 00:28:34,450 --> 00:28:35,270 Vậy là được rồi. 643 00:28:35,270 --> 00:28:37,290 Vì vậy, bây giờ chúng tôi có hai tách dầu. 644 00:28:37,290 --> 00:28:37,790 ĐƯỢC. 645 00:28:37,790 --> 00:28:38,510 Vậy là được rồi. 646 00:28:38,510 --> 00:28:40,110 Nhưng về mặt hóa học nếu điều này đã làm việc hơn I-- 647 00:28:40,110 --> 00:28:41,200 >> Lauren: Đây là nước. 648 00:28:41,200 --> 00:28:41,930 >> DAVID J. Malan: Đó là chủ yếu là nước. 649 00:28:41,930 --> 00:28:42,430 Được rồi. 650 00:28:42,430 --> 00:28:44,210 Nhưng đó vẫn là cốc như trước. 651 00:28:44,210 --> 00:28:47,570 Vì vậy, đổ it-- thử nó ở đó. 652 00:28:47,570 --> 00:28:49,300 ĐƯỢC. 653 00:28:49,300 --> 00:28:51,010 Đây là một sử dụng tốt thời gian học ngày hôm nay. 654 00:28:51,010 --> 00:28:51,510 ĐƯỢC. 655 00:28:51,510 --> 00:28:53,890 Vì vậy bây giờ we-- đẹp. 656 00:28:53,890 --> 00:28:55,460 Phân loại của. 657 00:28:55,460 --> 00:28:55,960 Được rồi. 658 00:28:55,960 --> 00:28:56,690 Vì vậy, rất tốt. 659 00:28:56,690 --> 00:29:00,006 Cảm ơn bạn Lauren. 660 00:29:00,006 --> 00:29:01,950 Thực hiện rất tốt. 661 00:29:01,950 --> 00:29:04,570 >> Như vậy chỉ cần thổi tâm trí của bạn, và điều này là một cái gì đó có lẽ 662 00:29:04,570 --> 00:29:08,660 để chơi với nếu bạn thích trong CS50 ID, bạn có thể, trên thực tế, trao đổi hai biến 663 00:29:08,660 --> 00:29:11,470 mà không sử dụng một số nguyên tạm thời. 664 00:29:11,470 --> 00:29:13,060 Và đây là mã C tương ứng. 665 00:29:13,060 --> 00:29:16,110 Và nếu bạn nhớ lại từ cuối cùng Thứ tư, chúng tôi giới thiệu, nếu một thời gian ngắn, 666 00:29:16,110 --> 00:29:19,720 một số nhà khai thác mới trong C. Và không ai nhớ lại những gì ít cà rốt 667 00:29:19,720 --> 00:29:23,660 biểu tượng là, hình tam giác nhỏ biểu tượng từ bàn phím đại diện? 668 00:29:23,660 --> 00:29:26,003 Điều hành Bitwise gì? 669 00:29:26,003 --> 00:29:26,770 >> Đung Exor. 670 00:29:26,770 --> 00:29:27,645 >> DAVID J. Malan: Exor. 671 00:29:27,645 --> 00:29:28,560 Exclusive Or. 672 00:29:28,560 --> 00:29:32,920 Vì vậy, nếu bạn muốn, chỉ để cho vui tại nhà, để cho a và b hai tùy ý 673 00:29:32,920 --> 00:29:36,072 giá trị như thế nào và tôi eight-- sẽ chọn một giá trị tám bit. 674 00:29:36,072 --> 00:29:38,530 Nếu bạn làm điều này với 32 bit, bạn sẽ rất nhanh chóng nhận được chán. 675 00:29:38,530 --> 00:29:42,150 Nhưng chỉ đưa ra một một chút tám giá trị đó là bất cứ điều gì, một hoặc hai, 676 00:29:42,150 --> 00:29:43,790 và cung cấp cho b một giá trị tương tự. 677 00:29:43,790 --> 00:29:46,810 Và sau đó sử dụng định nghĩa của XOR từ thứ Tư tuần trước, 678 00:29:46,810 --> 00:29:52,560 áp dụng bit của bit, mỗi tám bit trong mỗi của a và b, 679 00:29:52,560 --> 00:29:54,980 và sau đó làm điều đó một cách chính xác cho mỗi mã này. 680 00:29:54,980 --> 00:29:58,170 Và nó không phải là không chính xác những gì bạn nhìn thấy ở đây trên màn hình. 681 00:29:58,170 --> 00:30:02,100 Nó thực sự nắm để ba hoạt động XOR 682 00:30:02,100 --> 00:30:05,910 và bằng cách nào đó kỳ diệu và một b sẽ đổi vị trí 683 00:30:05,910 --> 00:30:08,010 mà không mất bất kỳ thông tin. 684 00:30:08,010 --> 00:30:11,580 >> Vì vậy, các trick dầu và nước là gần nhất thân thế giới thực 685 00:30:11,580 --> 00:30:12,980 Tôi có thể nghĩ ra để bắt chước mà. 686 00:30:12,980 --> 00:30:15,950 Nhưng nó chắc chắn dễ dàng hơn để sử dụng một biến tạm thời, 687 00:30:15,950 --> 00:30:16,920 như trong trường hợp này ở đây. 688 00:30:16,920 --> 00:30:21,190 Và điều này cũng là một cơ hội nói, quá, loại vi tối ưu hóa, 689 00:30:21,190 --> 00:30:23,590 như một nhà khoa học máy tính có thể nói, trong khi loại thú vị 690 00:30:23,590 --> 00:30:27,060 để khoe khoang về cách bạn đã làm điều này mà không cần như trao đổi với một biến thêm, 691 00:30:27,060 --> 00:30:28,640 nó không phải là tất cả những gì hấp dẫn. 692 00:30:28,640 --> 00:30:31,619 Bởi vì để tiết kiệm 32 bit, như trong trường hợp của một int thực tế, 693 00:30:31,619 --> 00:30:33,410 không phải là tất cả những gì hấp dẫn trên một hệ thống nơi 694 00:30:33,410 --> 00:30:36,722 bạn có thể được sử dụng hàng chục MB hoặc thậm chí nhiều bộ nhớ như những ngày này. 695 00:30:36,722 --> 00:30:38,680 Và trên thực tế, khi chúng tôi nhận được cho một vấn đề thiết lập sau 696 00:30:38,680 --> 00:30:41,010 và bạn thực hiện chính tả kiểm tra và bạn sẽ 697 00:30:41,010 --> 00:30:43,550 được thử thách để làm như vậy với RAM ít và ít 698 00:30:43,550 --> 00:30:46,820 thời gian nhất có thể trên computer-- bạn vẫn 699 00:30:46,820 --> 00:30:50,160 có một tuần để thực hiện it-- bạn sẽ have-- bạn sẽ có 700 00:30:50,160 --> 00:30:51,799 thách thức để giảm thiểu những tài nguyên. 701 00:30:51,799 --> 00:30:53,840 Và đó thực sự là chỉ Nhân dịp này học kỳ 702 00:30:53,840 --> 00:30:57,940 nơi bạn sẽ được khuyến khích để cạo râu off thậm chí hiệu suất tốt nhất 703 00:30:57,940 --> 00:30:59,340 chi phí khác. 704 00:30:59,340 --> 00:31:02,200 >> Vì vậy, làm sao chúng ta what-- thấy điều này trong mã thực tế? 705 00:31:02,200 --> 00:31:04,530 Hãy để tôi đi trước giờ và mở ra một ví dụ 706 00:31:04,530 --> 00:31:07,700 mà cố tình được gọi là Không Swap vì nó không 707 00:31:07,700 --> 00:31:10,670 trong thực tế, trao đổi các biến như bạn thực sự có thể mong đợi. 708 00:31:10,670 --> 00:31:12,260 Vì vậy, chúng ta hãy có một cái nhìn. 709 00:31:12,260 --> 00:31:17,050 Dưới đây là một chương trình mà không có CS50 thư viện đi vào, chỉ cần tiêu chuẩn I / O. 710 00:31:17,050 --> 00:31:19,560 Bây giờ chúng tôi có một nguyên mẫu cho swap lên hàng đầu mà chỉ 711 00:31:19,560 --> 00:31:21,540 có nghĩa là nó phải được định nghĩa sau. 712 00:31:21,540 --> 00:31:22,550 Và đây là chính. 713 00:31:22,550 --> 00:31:26,000 >> Tôi tự ý gán x và y, tương ứng, các giá trị một và hai 714 00:31:26,000 --> 00:31:28,590 chỉ bởi vì họ đang nhỏ và dễ dàng để nghĩ về. 715 00:31:28,590 --> 00:31:32,280 Và sau đó tôi chỉ có một bó của printfs nơi tôi có một kiểm tra sự tỉnh táo. x là 1 716 00:31:32,280 --> 00:31:35,110 và y là 2 có lẽ là những gì những người printfs sẽ nói. 717 00:31:35,110 --> 00:31:36,530 Vì vậy, không có phép thuật vậy, đến nay. 718 00:31:36,530 --> 00:31:40,100 >> Sau đó, tôi sẽ yêu cầu bồi thường với in def, trao đổi dot dot dot. 719 00:31:40,100 --> 00:31:43,730 Tôi sẽ gọi hoán đổi chức năng, đi qua trong x và y. 720 00:31:43,730 --> 00:31:47,350 Và chúng ta hãy giả định cho bây giờ mà trao đổi được thực hiện một cách chính xác 721 00:31:47,350 --> 00:31:49,930 vì nó là một khoảnh khắc trước với một biến tạm thời. 722 00:31:49,930 --> 00:31:52,670 Và vì vậy tôi mạnh dạn tuyên bố, đổi chỗ. 723 00:31:52,670 --> 00:31:55,429 x bây giờ điều này và y là bây giờ mà. 724 00:31:55,429 --> 00:31:57,220 Nhưng những tập tin, tất nhiên, được gọi là No Swap. 725 00:31:57,220 --> 00:31:58,678 Vì vậy, hãy thực sự nhìn thấy những gì xảy ra. 726 00:31:58,678 --> 00:32:04,450 Nếu tôi biên dịch không có trao đổi và sau đó làm ./noswap, x là 1, y là 2. 727 00:32:04,450 --> 00:32:05,770 Trao đổi đổi chỗ. 728 00:32:05,770 --> 00:32:07,200 x là 1, y là 2. 729 00:32:07,200 --> 00:32:11,980 Vì vậy, nó thực sự có vẻ có những thiếu sót thậm chí mặc dù swap-- hãy di chuyển xuống now-- 730 00:32:11,980 --> 00:32:16,542 được thực hiện chính xác theo các mã tôi đề xuất một thời gian trước đây. 731 00:32:16,542 --> 00:32:19,000 Vì vậy, chúng tôi sẽ không nhận được ưa thích với những thứ XOR cho bây giờ. 732 00:32:19,000 --> 00:32:21,890 Điều này, quá, nên chỉ làm việc giống như với sữa và OJ, 733 00:32:21,890 --> 00:32:25,820 nhưng nó dường như không được làm việc. 734 00:32:25,820 --> 00:32:27,180 >> Vì vậy, hãy làm điều này một lần nữa. 735 00:32:27,180 --> 00:32:29,310 Có lẽ tôi chỉ là không chạy đúng. 736 00:32:29,310 --> 00:32:32,010 Vì vậy, chúng ta hãy chạy No Swap lại. 737 00:32:32,010 --> 00:32:32,900 Có lẽ I-- không. 738 00:32:32,900 --> 00:32:34,400 Vì vậy, nó không chỉ làm việc. 739 00:32:34,400 --> 00:32:36,060 Vì vậy, chúng ta hãy làm một kiểm tra sự tỉnh táo chút. 740 00:32:36,060 --> 00:32:39,690 Hãy để tôi đi trước đây trong Swap và chỉ cần thêm, chờ một phút, 741 00:32:39,690 --> 00:32:43,856 một là% i / n và chúng ta hãy plug-in các giá trị của a. 742 00:32:43,856 --> 00:32:45,730 Bởi vì tôi thực sự muốn để xem những gì đang xảy ra. 743 00:32:45,730 --> 00:32:47,570 Và quả thực, đây là một kỹ thuật gỡ lỗi 744 00:32:47,570 --> 00:32:50,028 mà bạn có thể được sử dụng trong giờ văn phòng hay ở nhà đã có, 745 00:32:50,028 --> 00:32:53,560 giống như nửa đầu của Dan Video Armendáriz trong PSET3 746 00:32:53,560 --> 00:32:56,870 trong đó chúng tôi giới thiệu in def như một kỹ thuật được khuyến cáo, ít nhất 747 00:32:56,870 --> 00:32:58,080 đối với trường hợp đơn giản. 748 00:32:58,080 --> 00:33:01,720 Hãy để tôi đi trước và chạy make trao đổi không có một lần nữa, ./noswap. 749 00:33:01,720 --> 00:33:04,370 750 00:33:04,370 --> 00:33:05,840 >> Thú vị. 751 00:33:05,840 --> 00:33:11,670 Vì vậy, chú ý những gì có vẻ là đúng. x là 1, y là 2, nhưng một là 2 khi b là 1. 752 00:33:11,670 --> 00:33:16,790 Vì vậy, hai bằng cách nào đó đã đổi chỗ nhưng x và y không nhận đổi chỗ. 753 00:33:16,790 --> 00:33:21,090 Vì vậy, để được rõ ràng, những gì đang xảy ra được, ở đây tôi có x và y 754 00:33:21,090 --> 00:33:25,380 và những người đang có các biến địa phương trong phạm vi chính, tôi đang đi trong x và y 755 00:33:25,380 --> 00:33:26,170 Trao đổi. 756 00:33:26,170 --> 00:33:29,080 Bây giờ, trao đổi, như là một chức năng riêng biệt, là miễn phí để gọi đối số của nó 757 00:33:29,080 --> 00:33:30,590 hoặc các thông số của nó bất cứ điều gì nó muốn. 758 00:33:30,590 --> 00:33:33,280 Foo hoặc thanh hoặc x hoặc y hoặc a hoặc b. 759 00:33:33,280 --> 00:33:36,870 Chỉ cần để làm cho rõ ràng rằng họ đang không giống với x và y cho mỗi gia nhập, 760 00:33:36,870 --> 00:33:38,020 Tôi đã nói a và b. 761 00:33:38,020 --> 00:33:40,040 Nhưng chúng ta có thể gọi cho họ bất cứ điều gì chúng ta muốn. 762 00:33:40,040 --> 00:33:43,960 >> Và do đó, nó trông giống như trao đổi được thông qua 763 00:33:43,960 --> 00:33:48,980 x-- AKA a-- và nó được thông qua y-- AKA b. 764 00:33:48,980 --> 00:33:51,900 Bằng cách nào đó những ba dòng là trao đổi những giá trị chính xác 765 00:33:51,900 --> 00:33:53,510 như Lauren đã làm với sữa và OJ. 766 00:33:53,510 --> 00:33:56,010 Nhưng khi chúng tôi in ra các giá trị a và b 767 00:33:56,010 --> 00:34:01,340 có thực sự trao đổi nhưng x và y không có sự thay đổi với họ. 768 00:34:01,340 --> 00:34:03,150 Nhớ lại rằng x và y là lên đây. 769 00:34:03,150 --> 00:34:05,320 >> Vì vậy, chúng ta có thể thấy điều này qua kỹ thuật khác là tốt. 770 00:34:05,320 --> 00:34:08,110 Và điều này cũng là một kỹ thuật nhúng trong vấn đề thiết lập ba. 771 00:34:08,110 --> 00:34:10,780 Chúng ta hãy đi trước và làm điều này trong CS50 ID nếu bạn chưa có. 772 00:34:10,780 --> 00:34:13,730 Về phía chúng tôi tay phải có tab Debugger này. 773 00:34:13,730 --> 00:34:16,159 Và nếu bạn mở này lên, có một số thông tin phức tạp 774 00:34:16,159 --> 00:34:17,530 đó là ném vào bạn ban đầu. 775 00:34:17,530 --> 00:34:19,310 Nhưng chúng ta hãy trêu chọc này ngoài thật nhanh. 776 00:34:19,310 --> 00:34:21,620 >> Vì vậy, một trong, bạn sẽ thấy các biến địa phương. 777 00:34:21,620 --> 00:34:26,230 Chỉ ra rằng xây dựng thành CS50 IDE, và rất nhiều môi trường lập trình hơn 778 00:34:26,230 --> 00:34:28,060 nói chung, là một trình gỡ lỗi. 779 00:34:28,060 --> 00:34:31,340 Một công cụ cho phép bạn xem trực quan những gì đang xảy ra bên trong các chương trình của bạn 780 00:34:31,340 --> 00:34:34,380 mà không cần phải dùng đến thêm printfs và biên dịch và chạy 781 00:34:34,380 --> 00:34:37,588 và thêm printf và biên dịch và chạy, mà đã có, trong giờ hành chính 782 00:34:37,588 --> 00:34:40,070 hoặc nhà, có lẽ nhận được khá tẻ nhạt. 783 00:34:40,070 --> 00:34:43,090 >> Vì vậy, ở đây, chỉ trong một khoảnh khắc, chúng tôi sẽ thấy trong thời gian thực 784 00:34:43,090 --> 00:34:44,760 các giá trị của các biến địa phương của chúng tôi. 785 00:34:44,760 --> 00:34:47,880 Chúng tôi cũng sẽ có thể thiết lập những gì được gọi là các điểm ngắt mà 786 00:34:47,880 --> 00:34:52,570 những cơ hội trong chương trình của tôi để tạm dừng thực hiện tại một dòng cụ thể của mã 787 00:34:52,570 --> 00:34:53,710 mà tôi tò mò về. 788 00:34:53,710 --> 00:34:54,210 Phải không? 789 00:34:54,210 --> 00:34:55,969 Các chương trình này chạy trong một phần giây. 790 00:34:55,969 --> 00:35:00,450 Đó là loại tốt đẹp cho con người chúng ta chậm hơn để có thể tạm dừng, phải mất một lúc, thấy 791 00:35:00,450 --> 00:35:02,380 những gì đang xảy ra xung quanh một dòng nhất định mã 792 00:35:02,380 --> 00:35:05,050 mà không cày chương trình qua nó và kết thúc hoàn toàn. 793 00:35:05,050 --> 00:35:08,510 Vì vậy, một breakpoint sẽ cho phép chúng tôi phá vỡ và tạm dừng tại một điểm nhất định. 794 00:35:08,510 --> 00:35:12,990 >> Gọi chồng là một cách ưa thích của nói gì chức năng hiện đang là 795 00:35:12,990 --> 00:35:14,140 được gọi vào lúc này. 796 00:35:14,140 --> 00:35:15,370 Chính luôn được gọi đầu tiên. 797 00:35:15,370 --> 00:35:17,230 Nhưng nếu chính gọi một chức năng gọi là Swap, 798 00:35:17,230 --> 00:35:20,470 chúng tôi đang thực sự sẽ thấy điều này tháp của các chức năng đó đã được 799 00:35:20,470 --> 00:35:22,400 gọi theo thứ tự thời gian đảo ngược. 800 00:35:22,400 --> 00:35:23,310 Vì vậy, chúng ta hãy xem đó. 801 00:35:23,310 --> 00:35:24,327 >> Tôi sẽ để thu nhỏ. 802 00:35:24,327 --> 00:35:25,660 Tôi sẽ quay trở lại mã của tôi. 803 00:35:25,660 --> 00:35:27,540 Và chỉ vì tôi muốn là mô phạm ở đây, 804 00:35:27,540 --> 00:35:31,100 Tôi sẽ đi trước và bấm ngay bên trái của dòng năm. 805 00:35:31,100 --> 00:35:32,830 Và tạo ra một dấu chấm màu đỏ. 806 00:35:32,830 --> 00:35:36,200 Và hãy chú ý về phía bên tay phải rằng debugger biết, hey, 807 00:35:36,200 --> 00:35:41,020 Tôi chỉ nói một breakpoint ở dòng noswap.c năm, đặc biệt 808 00:35:41,020 --> 00:35:42,480 tại dòng mã này. 809 00:35:42,480 --> 00:35:45,090 Vì vậy, các debugger biết rằng Tôi đã yêu cầu trong thời gian tới 810 00:35:45,090 --> 00:35:48,530 Tôi chạy chương trình đó tôi tạm dừng thực hiện có thay vì chỉ 811 00:35:48,530 --> 00:35:50,390 chạy toàn bộ điều siêu nhanh. 812 00:35:50,390 --> 00:35:53,889 >> Vì vậy, bây giờ tôi sẽ để nhấn Debug nút ở đầu rất của IDE 813 00:35:53,889 --> 00:35:55,430 và đó là sẽ làm như sau. 814 00:35:55,430 --> 00:36:00,680 Nó sẽ mở một đầu hơi đáng sợ tìm terminal thứ hai window-- 815 00:36:00,680 --> 00:36:02,679 gỡ lỗi từ xa tổ chức như vậy và such-- 816 00:36:02,679 --> 00:36:04,970 và chúng tôi sẽ trở lại với những gì tất cả những gì có nghĩa là trước khi dài. 817 00:36:04,970 --> 00:36:09,020 Nhưng những gì là quan trọng đối với doanh nghiệp là rằng dấu chấm màu đỏ đã đánh, 818 00:36:09,020 --> 00:36:11,735 debugger có cố tình dừng execution-- 819 00:36:11,735 --> 00:36:15,560 không phải trên dòng cho mỗi gia nhập, nhưng vào ngày đầu tiên dòng mã thực tế trong chức năng đó. 820 00:36:15,560 --> 00:36:18,040 Và đó là lý do tại sao dòng bảy là nay đánh dấu màu vàng. 821 00:36:18,040 --> 00:36:20,550 >> Và bây giờ chúng ta hãy có một cái nhìn ở phía bên tay phải. 822 00:36:20,550 --> 00:36:27,300 Dường như, theo mặc định, độc đáo đủ, x có giá trị gì? 823 00:36:27,300 --> 00:36:27,860 0. 824 00:36:27,860 --> 00:36:29,750 Và y có giá trị gì? 825 00:36:29,750 --> 00:36:30,410 Zero. 826 00:36:30,410 --> 00:36:35,540 Và đó là để được mong đợi trong ý nghĩa rằng x và y-- rằng line-- vàng có 827 00:36:35,540 --> 00:36:36,770 không thực hiện được nêu ra. 828 00:36:36,770 --> 00:36:38,510 Vì vậy, không nên x có giá trị 1. 829 00:36:38,510 --> 00:36:41,470 Nó có thể có giá trị khác, một giá trị được gọi là rác. 830 00:36:41,470 --> 00:36:44,320 Và chúng tôi đã may mắn ở chỗ nó bằng không ở thời điểm này, về cơ bản. 831 00:36:44,320 --> 00:36:46,400 >> Vì vậy, hiện nay chỉ có một vài nút, chúng tôi cần phải quan tâm 832 00:36:46,400 --> 00:36:48,100 khi gỡ lỗi trong cách này. 833 00:36:48,100 --> 00:36:49,970 Chú ý ở đây, chúng ta có một nút Play. 834 00:36:49,970 --> 00:36:51,877 Và nếu chúng tôi chơi hoặc nhấn tiếp tục, đó chỉ là 835 00:36:51,877 --> 00:36:53,710 sẽ chạy qua phần còn lại của chương trình 836 00:36:53,710 --> 00:36:55,300 hoặc cho đến khi nó chạm breakpoint khác. 837 00:36:55,300 --> 00:36:56,910 Nhưng tôi đã không đặt bất kỳ khác breakpoint vì vậy nó chỉ 838 00:36:56,910 --> 00:36:58,118 sẽ chạy qua kết thúc. 839 00:36:58,118 --> 00:37:00,280 Đó là loại đánh bại Mục đích của chĩa ra xung quanh. 840 00:37:00,280 --> 00:37:03,290 >> Vì vậy, thay vào đó, tôi quan tâm các biểu tượng bên phải. 841 00:37:03,290 --> 00:37:05,360 Và nếu tôi đưa chuột qua họ, như bạn cũng nên như vậy, 842 00:37:05,360 --> 00:37:07,450 bạn sẽ thấy chút mẹo công cụ tips--. 843 00:37:07,450 --> 00:37:09,020 Đây là một bước qua. 844 00:37:09,020 --> 00:37:11,290 Bây giờ điều đó không có nghĩa là bỏ qua các dòng mã sau đây. 845 00:37:11,290 --> 00:37:14,840 Điều đó chỉ có nghĩa là thực hiện nó và di chuyển đến tiếp theo, di chuyển đến tiếp theo, 846 00:37:14,840 --> 00:37:15,580 di chuyển đến tiếp theo. 847 00:37:15,580 --> 00:37:17,610 Nói cách khác, thông qua nút đó, tôi có thể đi bộ 848 00:37:17,610 --> 00:37:20,390 qua tôi mã một bước tại một thời điểm. 849 00:37:20,390 --> 00:37:21,914 Từng dòng, theo nghĩa đen. 850 00:37:21,914 --> 00:37:23,830 Bây giờ, bên phải rằng, có một khác 851 00:37:23,830 --> 00:37:25,163 rằng chúng ta sẽ thấy chỉ trong một khoảnh khắc. 852 00:37:25,163 --> 00:37:27,820 Đây là cái gọi là Bước vào biểu tượng đó 853 00:37:27,820 --> 00:37:30,300 sẽ cho phép tôi bổ nhào vào chức năng khác. 854 00:37:30,300 --> 00:37:31,800 Nhưng hãy xem này chỉ trong một khoảnh khắc. 855 00:37:31,800 --> 00:37:33,280 Vì vậy, tôi sẽ bấm bước qua. 856 00:37:33,280 --> 00:37:35,820 Và bây giờ nhận thấy, khi tôi bấm nút này ở trên cùng bên phải, 857 00:37:35,820 --> 00:37:41,260 giữ cho đôi mắt của bạn khoảng trên Local Biến và xem những gì sẽ xảy ra với x. 858 00:37:41,260 --> 00:37:44,115 x bây giờ là 1 vì dòng màu vàng hiện nay đã thực hiện 859 00:37:44,115 --> 00:37:45,840 và chúng tôi đã chuyển sang dòng 8. 860 00:37:45,840 --> 00:37:49,840 Và chỉ trong một khoảnh khắc y hy vọng sẽ trở thành 2. 861 00:37:49,840 --> 00:37:52,330 >> Bây giờ, không có gì thú vị xảy ra cho một chút. 862 00:37:52,330 --> 00:37:53,390 Tất cả điều này là là printf. 863 00:37:53,390 --> 00:37:58,010 Và hãy chú ý, trong thiết bị đầu cuối trung học của tôi cửa sổ, tôi nhìn thấy đầu ra của in def. 864 00:37:58,010 --> 00:38:01,080 Và bây giờ tôi phải làm một quyết định như các lập trình viên. 865 00:38:01,080 --> 00:38:04,360 Tôi có thể bước qua dòng này của mã, thực hiện nó nhưng không 866 00:38:04,360 --> 00:38:06,220 nhận được tò mò về những gì bên trong. 867 00:38:06,220 --> 00:38:11,130 Hoặc tôi có thể thực sự bước vào nó và đi vào bên trong của Swap chính nó. 868 00:38:11,130 --> 00:38:12,340 Vì vậy, chúng ta hãy làm sau này. 869 00:38:12,340 --> 00:38:15,550 >> Hãy để tôi đi trước và bấm không Step Over nhưng Step Into. 870 00:38:15,550 --> 00:38:17,300 Thông báo, tất cả của một đột ngột những thay đổi cửa sổ 871 00:38:17,300 --> 00:38:19,330 để làm nổi bật đầu tiên dòng mã trong Swap. 872 00:38:19,330 --> 00:38:20,710 Đó là dòng 21. 873 00:38:20,710 --> 00:38:25,220 Và bây giờ, những gì là loại sôi nổi là, nếu bạn nhìn qua đây, như mong đợi, 874 00:38:25,220 --> 00:38:29,720 một dấu phẩy b là 1 và 2 tương ứng. 875 00:38:29,720 --> 00:38:33,840 Tại sao nhiệt độ 32.767? 876 00:38:33,840 --> 00:38:36,560 Nhắc lại temp mà, giống như cốc rỗng một thời điểm trước đây, 877 00:38:36,560 --> 00:38:38,980 được khai báo ở đây trên dòng 21. 878 00:38:38,980 --> 00:38:43,390 Tại sao 32,000- tôi là, tại sao nó chỉ là một số giá trị kỳ lạ? 879 00:38:43,390 --> 00:38:43,890 Yeah? 880 00:38:43,890 --> 00:38:45,190 >> Đung Nó không được khởi tạo. 881 00:38:45,190 --> 00:38:46,940 >> DAVID J. Malan: Đó là không được khởi tạo. 882 00:38:46,940 --> 00:38:49,370 Vì vậy, máy tính của chúng tôi luôn luôn có bộ nhớ vật lý. 883 00:38:49,370 --> 00:38:50,544 Nó luôn luôn có RAM vật lý. 884 00:38:50,544 --> 00:38:52,710 Và luôn luôn có số không của và một ở trong đó, phải không? 885 00:38:52,710 --> 00:38:54,626 Bởi vì chúng ta đang sử dụng của chúng tôi máy tính cả ngày dài, 886 00:38:54,626 --> 00:38:57,210 bạn đang sử dụng các IDE CS50 hoặc các máy chủ tất cả các ngày dài. 887 00:38:57,210 --> 00:39:01,159 Vì vậy, bộ nhớ RAM mà có thể có được một số con số không hay một số một hoặc một số số không và những người thân. 888 00:39:01,159 --> 00:39:02,950 Không có vấn đề hay không bạn đang sử dụng chúng. 889 00:39:02,950 --> 00:39:05,270 Bạn có thể không chỉ có trống không gian nơi bạn muốn bit. 890 00:39:05,270 --> 00:39:06,850 Họ đang hoặc là số không và những người thân. 891 00:39:06,850 --> 00:39:09,610 >> Vì vậy, nó quay ra temp mà, vì chúng tôi đã không được khởi tạo được chưa, 892 00:39:09,610 --> 00:39:14,580 chúng ta có những 32 bit nhưng họ đã không được khởi tạo với bất kỳ giá trị đã biết. 893 00:39:14,580 --> 00:39:18,110 Vì vậy, bất cứ điều gì họ nhất sử dụng gần đây for-- những 32 bits-- 894 00:39:18,110 --> 00:39:23,000 chúng ta chỉ nhìn thấy những hiện vật của một số sử dụng trước đó của những người đặc biệt 32 895 00:39:23,000 --> 00:39:23,500 bit. 896 00:39:23,500 --> 00:39:27,780 Ngay sau khi tôi bấm Step Over mặc dù, phew, temp là đi để có được giá trị 1. 897 00:39:27,780 --> 00:39:31,600 Và nếu tôi làm điều đó một lần nữa, một là sắp được cho giá trị 2 898 00:39:31,600 --> 00:39:33,830 và sau đó b là sẽ được gán giá trị là 1. 899 00:39:33,830 --> 00:39:36,390 >> Và vì vậy những gì là tốt đẹp tại thời điểm này trong các câu chuyện 900 00:39:36,390 --> 00:39:39,750 là debugger là hiển thị cho tôi, siêu chậm 901 00:39:39,750 --> 00:39:42,640 theo tốc độ của riêng tôi, những gì bang Swap là. 902 00:39:42,640 --> 00:39:47,490 Nhưng cần chú ý ở phía trên đây, thông báo rằng các cuộc gọi stack thực 903 00:39:47,490 --> 00:39:49,180 có hai lớp với nó. 904 00:39:49,180 --> 00:39:53,240 Bây giờ một trong đó là nhấn mạnh như Trao đổi, nếu tôi bấm vào Main thay vào đó, 905 00:39:53,240 --> 00:39:57,100 lưu ý các biến địa phương thay đổi bởi vì các nhà phát triển chỉ có thể nhảy 906 00:39:57,100 --> 00:39:59,740 xung quanh và đi vào bất kỳ phạm vi khác nhau. 907 00:39:59,740 --> 00:40:04,070 Vì vậy, mặc dù chúng tôi đang làm tất cả điều này làm việc và trao đổi một cách chính xác a, b, 908 00:40:04,070 --> 00:40:09,080 nếu tôi đi lại giữa Swap nơi một là 2 và b là 1 và chính, 909 00:40:09,080 --> 00:40:11,851 đã chính bị ảnh hưởng ở tất cả? 910 00:40:11,851 --> 00:40:12,350 Không. 911 00:40:12,350 --> 00:40:13,930 Vì vậy, các takeaway ở đây là gì? 912 00:40:13,930 --> 00:40:18,200 Vâng, nó chỉ ra rằng bất cứ lúc nào bạn gọi một chức năng như Swap, 913 00:40:18,200 --> 00:40:21,600 và bạn vượt qua tham số của nó, những gì bạn đang đi qua với chức năng Swap 914 00:40:21,600 --> 00:40:24,730 trong trường hợp này là một bản sao những đối số. 915 00:40:24,730 --> 00:40:28,620 Vì vậy, nếu x và y là mỗi lần lượt 32 bit, những gì Swap là nhận được 916 00:40:28,620 --> 00:40:30,760 là hai địa phương mới biến, hay tranh luận, 917 00:40:30,760 --> 00:40:34,380 gọi là a và b-- nhưng những người độc đoán names-- nhưng mô hình của số không 918 00:40:34,380 --> 00:40:39,520 và những người bên trong của a và b là xếp hàng để được giống hệt nhau để x và y 919 00:40:39,520 --> 00:40:42,610 nhưng họ không phải là giống như là x và y. 920 00:40:42,610 --> 00:40:46,880 >> Nó như thể chính có trên mảnh của nó giấy số 1 và 2 cho x và y, 921 00:40:46,880 --> 00:40:49,260 và sau đó khi nó tay mà mảnh giấy để Trao đổi, 922 00:40:49,260 --> 00:40:51,970 Trao đổi rất nhanh chóng giúp bút riêng của mình, viết xuống 923 00:40:51,970 --> 00:40:56,240 1 và 2 trên bảng riêng của mình giấy, tay sao các xy gốc để chính 924 00:40:56,240 --> 00:40:58,790 và sau đó làm của riêng mình điều với a và b. 925 00:40:58,790 --> 00:41:01,940 Và điều này bây giờ là siêu quan trọng bởi vì này có ý nghĩa không tầm thường 926 00:41:01,940 --> 00:41:06,260 cho việc viết mã đúng bởi vì nó sẽ có vẻ chúng ta không thể trao đổi 927 00:41:06,260 --> 00:41:07,500 hai biến. 928 00:41:07,500 --> 00:41:09,150 >> Tôi đã viết một hàm Swap đúng. 929 00:41:09,150 --> 00:41:12,770 Chúng tôi đã thực hiện nó với Lauren như một chức năng trao đổi chính xác trong thực tế, 930 00:41:12,770 --> 00:41:16,700 nhưng dường như không ai trong số đó vấn đề nếu bạn có thể không thực sự 931 00:41:16,700 --> 00:41:19,530 trao đổi hai giá trị vĩnh viễn. 932 00:41:19,530 --> 00:41:21,970 Vì vậy, chúng ta cần một cách khác để thực sự có được lúc này, 933 00:41:21,970 --> 00:41:24,472 và chúng ta cần để có thể thực sự giải quyết vấn đề này. 934 00:41:24,472 --> 00:41:27,180 Và nó quay out-- và chúng tôi sẽ đến trở lại hình ảnh đặc biệt này 935 00:41:27,180 --> 00:41:30,500 trước long-- này là một trong những cách mà bạn có thể vẽ bộ nhớ máy tính của bạn. 936 00:41:30,500 --> 00:41:31,460 Nó chỉ là một hình chữ nhật. 937 00:41:31,460 --> 00:41:32,960 Bạn có thể vẽ nó bất kỳ số cách nhưng nó 938 00:41:32,960 --> 00:41:35,740 thuận tiện để vẽ nó như là một hình chữ nhật với lý do sau đây. 939 00:41:35,740 --> 00:41:40,040 >> Chúng ta sẽ bắt đầu hôm nay và xa hơn nữa nói về cái gọi là stack. 940 00:41:40,040 --> 00:41:43,870 Và ngăn xếp chỉ là một đoạn của RAM-- một đoạn memory-- 941 00:41:43,870 --> 00:41:47,100 có chức năng có thể truy cập đến khi chúng được gọi. 942 00:41:47,100 --> 00:41:49,800 Và do đó, nó chỉ ra rằng tại dưới cùng của ngăn xếp này 943 00:41:49,800 --> 00:41:53,590 là nơi mà tất cả các biến địa chính của org và C và org V và tất cả những thứ 944 00:41:53,590 --> 00:41:56,950 sẽ đi theo mặc định. Và nếu chính kêu gọi một số chức năng khác như hoán đổi, 945 00:41:56,950 --> 00:42:00,330 tốt, Swap là sẽ có được một lớp của bộ nhớ lên trên nó. 946 00:42:00,330 --> 00:42:04,490 >> Và vì vậy chỉ để cung cấp cho bạn một cách nhanh chóng lướt qua hình ảnh này, nếu tôi đi qua here-- 947 00:42:04,490 --> 00:42:09,450 và cho tôi phản ánh này trên trên không như well-- những gì thực sự tôi có, 948 00:42:09,450 --> 00:42:12,100 nếu chúng ta chỉ quan tâm đến đáy của hình ảnh này cho bây giờ, 949 00:42:12,100 --> 00:42:15,070 là khi tôi chạy một chương trình và chính được gọi là, 950 00:42:15,070 --> 00:42:18,330 Chính được đưa ra một đoạn RAM trong máy tính của tôi mà là 951 00:42:18,330 --> 00:42:20,060 ở dưới cùng của cái gọi là stack. 952 00:42:20,060 --> 00:42:22,143 Và tôi sẽ rút ra nó cố tình như một hình vuông. 953 00:42:22,143 --> 00:42:24,540 Vì vậy, nó giống như 32 bit hay bốn byte. 954 00:42:24,540 --> 00:42:28,790 Và nếu chức năng chính này có một biến gọi là x có giá trị là 1 955 00:42:28,790 --> 00:42:32,626 và nó có một biến gọi là y với giá trị 2, đó là 956 00:42:32,626 --> 00:42:35,750 giống như lấy mảnh này của bộ nhớ mà Chính đã được đưa ra bởi các điều hành 957 00:42:35,750 --> 00:42:38,850 hệ thống và chia nó lên để các biến địa phương đầu tiên tại đây, 958 00:42:38,850 --> 00:42:40,930 điều thứ hai tại đây, và đó là nó. 959 00:42:40,930 --> 00:42:45,590 >> Khi chính gọi Swap, Swap được lát riêng của bộ nhớ 960 00:42:45,590 --> 00:42:48,280 rằng chúng ta sẽ vẽ như thế này từ hệ điều hành, 961 00:42:48,280 --> 00:42:50,820 và nó sẽ có của nó biến cục bộ của riêng dựa 962 00:42:50,820 --> 00:42:53,825 về việc thực hiện của chúng tôi trước đó với các biến địa phương một 963 00:42:53,825 --> 00:42:58,010 và b mà ban đầu được các giá trị 1 và 2. 964 00:42:58,010 --> 00:43:00,450 Nhưng sau đó, ngay sau khi mã Swap thực hiện, 965 00:43:00,450 --> 00:43:03,760 và Lauren thực sự hoán đổi OJ và sữa, những gì đang xảy ra? 966 00:43:03,760 --> 00:43:09,030 Vâng, 2 này đang trở thành một 1, điều này 1 đang trở thành một 2, và, bằng cách này, 967 00:43:09,030 --> 00:43:13,360 có một biến temp đó là được sử dụng mà toàn bộ thời gian mà cuối cùng 968 00:43:13,360 --> 00:43:14,470 Đi đi. 969 00:43:14,470 --> 00:43:16,720 Nhưng nó không quan trọng bao nhiêu công việc bạn làm 970 00:43:16,720 --> 00:43:22,160 trong dòng này of-- trong không gian bộ nhớ này, x và y là hoàn toàn nguyên vẹn. 971 00:43:22,160 --> 00:43:26,320 >> Vì vậy, chúng tôi cần một số cách cho Hoán đổi và các chức năng như nó 972 00:43:26,320 --> 00:43:32,640 truy cập bí mật, nếu bạn muốn, để chức năng like-- để nhớ như x và y. 973 00:43:32,640 --> 00:43:35,110 Vì vậy, chúng ta hãy nhìn vào một ví dụ giúp 974 00:43:35,110 --> 00:43:38,220 chúng tôi thấy chính xác những gì đang được đi trên toàn bộ thời gian này. 975 00:43:38,220 --> 00:43:40,284 Tôi sẽ đi trước và mở ra so sánh Zero. 976 00:43:40,284 --> 00:43:42,200 Và tôi sẽ phải đóng cửa gỡ rối của chúng tôi, tôi sẽ 977 00:43:42,200 --> 00:43:44,360 để đóng thông báo tìm kiếm đáng sợ này chỉ nói, chờ một phút, 978 00:43:44,360 --> 00:43:45,800 bạn đang ở trong các trung gỡ lỗi. 979 00:43:45,800 --> 00:43:48,383 Tôi sẽ để ẩn tab này ở đây chỉ để trở lại đơn giản. 980 00:43:48,383 --> 00:43:50,160 Vì vậy, đừng lo lắng nếu GDB sẽ bị chết. 981 00:43:50,160 --> 00:43:53,910 Điều đó chỉ có nghĩa là chương trình có được bỏ thuốc lá, cố ý trong trường hợp này, 982 00:43:53,910 --> 00:43:54,820 bởi tôi. 983 00:43:54,820 --> 00:43:57,700 >> Và bây giờ so sánh Zero, thực hiện điều này. 984 00:43:57,700 --> 00:44:00,110 Tôi đang sử dụng CS50 thư viện trong tiêu chuẩn I / O. 985 00:44:00,110 --> 00:44:04,319 Tôi đã có một chức năng chính đầu tiên nói, nói điều gì đó, và nhận được một chuỗi. 986 00:44:04,319 --> 00:44:06,110 Sau đó nói nó một lần nữa và được một chuỗi khác. 987 00:44:06,110 --> 00:44:09,910 Và nhận thấy rằng hai chuỗi các được gọi là s và t, tương ứng. 988 00:44:09,910 --> 00:44:12,910 Và bây giờ chương trình này, so sánh Zero, mục đích của nó trong cuộc sống, 989 00:44:12,910 --> 00:44:15,470 nó phải cho tôi biết, Tôi đã gõ những điều tương tự? 990 00:44:15,470 --> 00:44:16,910 Và vì vậy tôi sẽ trở lại với một tuần. 991 00:44:16,910 --> 00:44:19,950 Tôi đang sử dụng toán tử bằng bằng tôi đó là các nhà điều hành có chất lượng. 992 00:44:19,950 --> 00:44:22,220 Không phải là điều hành phân công, điều hành bình đẳng. 993 00:44:22,220 --> 00:44:23,890 Tôi chỉ so sánh s và t. 994 00:44:23,890 --> 00:44:27,470 >> Vì vậy, hãy thực sự đi trước và làm điều này. 995 00:44:27,470 --> 00:44:32,680 Và tôi sẽ đi trước và làm cho So sánh Zero. 996 00:44:32,680 --> 00:44:35,110 Tôi sẽ làm ./comparezero. 997 00:44:35,110 --> 00:44:37,150 Và tôi sẽ đi trước và nói điều gì đó 998 00:44:37,150 --> 00:44:43,450 như thế, chúng ta hãy làm mẹ trong chữ thường và làm thế nào về mẹ chữ hoa. 999 00:44:43,450 --> 00:44:45,034 Và dĩ nhiên tôi gõ những thứ khác nhau. 1000 00:44:45,034 --> 00:44:45,533 Được rồi. 1001 00:44:45,533 --> 00:44:46,570 Đó là để được mong đợi. 1002 00:44:46,570 --> 00:44:47,640 >> Hãy chạy lại nó. 1003 00:44:47,640 --> 00:44:49,740 Cả hai lần làm chữ thường, chữ thường. 1004 00:44:49,740 --> 00:44:51,490 Điều đó có vẻ siêu giống với tôi. 1005 00:44:51,490 --> 00:44:52,930 Nhập. 1006 00:44:52,930 --> 00:44:53,430 ĐƯỢC. 1007 00:44:53,430 --> 00:44:55,804 Có lẽ nó chỉ lạ bởi vì nó không thích ngữ pháp của tôi. 1008 00:44:55,804 --> 00:44:59,930 Vì vậy, chúng ta hãy làm một MOM vốn, vốn MOM, giống hệt nhau. 1009 00:44:59,930 --> 00:45:01,490 Những thứ khác. 1010 00:45:01,490 --> 00:45:03,907 >> Vì vậy, tại sao vậy? 1011 00:45:03,907 --> 00:45:06,240 Vâng, những gì đang thực sự xảy ra trên dưới mui xe ở đây? 1012 00:45:06,240 --> 00:45:08,180 Vì vậy, chúng ta hãy nhìn lại ở đây chỉ một khoảnh khắc 1013 00:45:08,180 --> 00:45:10,910 và xem xét những gì GetString là thực sự làm. 1014 00:45:10,910 --> 00:45:13,385 Khi bạn gọi GetString, đó là một hàm chúng ta 1015 00:45:13,385 --> 00:45:16,510 mình đã viết và nó bằng cách nào đó được một chuỗi các ký tự từ người sử dụng. 1016 00:45:16,510 --> 00:45:20,280 Và chúng ta hãy giả định rằng người đầu tiên Hiện tôi gọi GetString, mà mang lại cho tôi 1017 00:45:20,280 --> 00:45:21,930 một đoạn bộ nhớ trông như thế này. 1018 00:45:21,930 --> 00:45:26,990 Và nếu tôi gõ trong tất cả chữ thường m-o-m-- và những gì diễn ra sau đó? 1019 00:45:26,990 --> 00:45:28,840 Chỉ cần kiểm tra sự tỉnh táo nhanh chóng. 1020 00:45:28,840 --> 00:45:29,780 >> Không gạch chéo ngược. 1021 00:45:29,780 --> 00:45:30,510 Chúng ta biết rằng. 1022 00:45:30,510 --> 00:45:32,784 Và nhớ lại rằng chúng tôi đã chơi xung quanh với tên Zamila của 1023 00:45:32,784 --> 00:45:34,950 và một loạt các tên tuổi khác khi Rob đã ở đây tìm kiếm 1024 00:45:34,950 --> 00:45:36,280 vào những gì đang xảy ra bên trong bộ nhớ. 1025 00:45:36,280 --> 00:45:37,780 Vì vậy, câu chuyện đó là chính xác như nhau. 1026 00:45:37,780 --> 00:45:40,160 Đây là những gì GetString đang trở lại với tôi. 1027 00:45:40,160 --> 00:45:44,780 Bây giờ, mã số của tôi lúc nãy lưu trữ giá trị trả về của GetString 1028 00:45:44,780 --> 00:45:47,510 trong một biến gọi là s. 1029 00:45:47,510 --> 00:45:51,390 Và sau đó lần thứ hai tôi gọi nó, nó được lưu trữ nó trong một biến gọi là t. 1030 00:45:51,390 --> 00:45:55,070 >> Vì vậy, nếu tôi đi qua đây, tôi cần để vẽ variable-- địa phương này 1031 00:45:55,070 --> 00:45:59,610 và tôi thường đi vẽ một chuỗi như just-- chúng tôi sẽ 1032 00:45:59,610 --> 00:46:02,360 gọi nó s-- như một hình vuông nhỏ ở đây. 1033 00:46:02,360 --> 00:46:09,760 Và bây giờ, somehow-- thế nào mẹ đi vào bên trong của biến s này? 1034 00:46:09,760 --> 00:46:12,010 Vâng, chúng ta cần phải trở lại nguyên tắc đầu tiên ở đây. 1035 00:46:12,010 --> 00:46:15,660 Điều gì đang thực sự GetString trở về? 1036 00:46:15,660 --> 00:46:19,030 >> Vì vậy, nó chỉ ra rằng M-O-M dấu gạch chéo ngược bằng không, và bất kỳ số 1037 00:46:19,030 --> 00:46:22,364 của chuỗi khác trong bộ nhớ như Zamila và Rob hay Andy hoặc bất kỳ người khác, 1038 00:46:22,364 --> 00:46:24,280 tất nhiên là trong chúng tôi RAM hoặc bộ nhớ của máy tính. 1039 00:46:24,280 --> 00:46:27,760 Và bộ nhớ RAM của bạn có like-- bạn có một buổi biểu diễn của RAM, hai hợp đồng biểu diễn của bộ nhớ RAM, 1040 00:46:27,760 --> 00:46:30,860 hoặc một hoặc hai tỷ tỷ byte, hoặc thậm chí có thể nhiều hơn những ngày này. 1041 00:46:30,860 --> 00:46:34,070 Vì vậy, chúng ta hãy giả định, vì mục đích của ngày hôm nay, rằng nó không quan trọng như thế nào, chúng tôi đánh số 1042 00:46:34,070 --> 00:46:36,640 chúng, nhưng chúng ta có thể đánh số mỗi của những tỷ hoặc hai tỷ 1043 00:46:36,640 --> 00:46:37,880 hoặc bốn tỷ byte. 1044 00:46:37,880 --> 00:46:42,240 >> Và chúng ta hãy chỉ nói rằng tùy tiện đây là lần đầu tiên cắn, cắn thứ hai, 1045 00:46:42,240 --> 00:46:43,380 thứ ba, thứ tư. 1046 00:46:43,380 --> 00:46:46,570 Tôi cố tình không sử dụng số không cho ngày hôm nay nhưng chúng tôi sẽ quay trở lại đó. 1047 00:46:46,570 --> 00:46:49,570 Vì vậy, nói cách khác, nếu điều này là lần đầu tiên tôi sử dụng chương trình, 1048 00:46:49,570 --> 00:46:52,715 Tôi chỉ nhận được may mắn và lần đầu tiên cắn là tại địa điểm duy nhất sau đó hai 1049 00:46:52,715 --> 00:46:53,590 sau đó ba hơn bốn. 1050 00:46:53,590 --> 00:46:57,430 Và nếu tôi cứ vẽ, hộp số hai tỷ sẽ là cách trên đây. 1051 00:46:57,430 --> 00:47:02,200 >> Vậy điều gì làm bạn nghĩ rằng, sau đó, GetString thực sự trả về? 1052 00:47:02,200 --> 00:47:06,010 Nó không phải trả lại M-O-M backslash zero cho mỗi gia nhập, vì đó rõ ràng 1053 00:47:06,010 --> 00:47:08,180 sẽ không phù hợp trong hộp mà tôi đã vẽ. 1054 00:47:08,180 --> 00:47:11,210 Vì vậy, những gì khác có thể GetString thực được trả lại tất cả những tuần này? 1055 00:47:11,210 --> 00:47:14,410 1056 00:47:14,410 --> 00:47:16,820 Câu trả lời là trên hội đồng quản trị ở đâu đây thôi. 1057 00:47:16,820 --> 00:47:20,390 Bạn không thể phù hợp với M-O-M backslash zero, vì vậy những gì có thể làm cho tinh thần để thay thế? 1058 00:47:20,390 --> 00:47:23,424 Nếu bạn đã có được siêu thông minh, đặt về cái gọi là hat kỹ thuật, 1059 00:47:23,424 --> 00:47:24,340 những gì bạn có thể trở lại? 1060 00:47:24,340 --> 00:47:27,340 Số tiền ít nhất của thông tin là gì bạn có thể trở về mà sẽ vẫn 1061 00:47:27,340 --> 00:47:30,610 cho phép bạn tìm M-O-M trong bộ nhớ? 1062 00:47:30,610 --> 00:47:31,270 Yeah? 1063 00:47:31,270 --> 00:47:31,950 >> Đung One. 1064 00:47:31,950 --> 00:47:32,200 >> DAVID J. Malan: One. 1065 00:47:32,200 --> 00:47:33,021 Và tại sao người ta? 1066 00:47:33,021 --> 00:47:35,520 Đung Bởi vì nó sẽ cho bạn phải đi đâu [không nghe được]. 1067 00:47:35,520 --> 00:47:38,391 1068 00:47:38,391 --> 00:47:39,390 DAVID J. Malan: Chính xác. 1069 00:47:39,390 --> 00:47:44,300 Tôi chỉ cần đi để trở về địa chỉ của chuỗi mà tôi đã nhận được. 1070 00:47:44,300 --> 00:47:46,570 Các địa chỉ trong này trường hợp là địa điểm duy nhất. 1071 00:47:46,570 --> 00:47:51,280 Vì vậy, những gì thực sự đang được lưu trữ trong s-- và tất cả các biến chuỗi do đó far-- 1072 00:47:51,280 --> 00:47:53,430 vừa được các địa chỉ của chuỗi đó. 1073 00:47:53,430 --> 00:47:57,840 >> Trong khi đó, nếu tôi gọi GetString một lần thứ hai và tôi 1074 00:47:57,840 --> 00:48:03,300 gõ vào nghĩa đen thing-- cùng M-O-M với lowercase-- M-O-M 1075 00:48:03,300 --> 00:48:06,200 và một dấu gạch chéo ngược bằng không, và bây giờ có lẽ chương trình của tôi 1076 00:48:06,200 --> 00:48:09,820 được chạy trong một thời gian như vậy có lẽ này là 10, đây là vị trí 11, là 12, 1077 00:48:09,820 --> 00:48:10,700 này là 13. 1078 00:48:10,700 --> 00:48:13,590 Các máy tính sử dụng một số khác bộ nhớ vì lý do gì. 1079 00:48:13,590 --> 00:48:18,172 Những gì bây giờ đi vào thứ hai của tôi biến trong chương trình của tôi t? 1080 00:48:18,172 --> 00:48:19,390 10. 1081 00:48:19,390 --> 00:48:20,050 Chính xác. 1082 00:48:20,050 --> 00:48:23,910 >> Và như vậy khi chúng ta nhìn vào mã nguồn của chương trình này 1083 00:48:23,910 --> 00:48:26,550 nơi mà tôi chỉ cần cố gắng để so sánh hai giá trị, 1084 00:48:26,550 --> 00:48:32,180 là s tương đương bằng t, có chuyện gì câu trả lời rõ ràng của con người? 1085 00:48:32,180 --> 00:48:34,890 Chỉ cần không có vì 1 không bằng 10. 1086 00:48:34,890 --> 00:48:36,861 Và vì vậy đây nằm một cơ hội cho chúng ta thực sự 1087 00:48:36,861 --> 00:48:39,610 chỉ cần đi trở lại, một lần nữa, lần đầu tiên nguyên tắc và suy nghĩ về, cũng, 1088 00:48:39,610 --> 00:48:41,110 những gì đang xảy ra bên dưới mui xe? 1089 00:48:41,110 --> 00:48:43,240 Chúng tôi đã nói về bit và byte và bộ nhớ, 1090 00:48:43,240 --> 00:48:46,820 nhưng nó thực sự hữu ích để hiểu bởi vì khi bạn gọi GetString, 1091 00:48:46,820 --> 00:48:50,280 mặc dù chúng ta nghĩ về nó là trở về M-O-M hoặc chuỗi mẹ 1092 00:48:50,280 --> 00:48:53,120 hoặc Andy hoặc Zamila hay như thế, về mặt kỹ thuật 1093 00:48:53,120 --> 00:48:55,510 nó chỉ trở về địa chỉ trong đó đoạn bộ nhớ. 1094 00:48:55,510 --> 00:48:56,910 >> Nhưng đó là OK. 1095 00:48:56,910 --> 00:49:00,570 Bởi vì làm sao tôi biết nơi kết thúc chuỗi? 1096 00:49:00,570 --> 00:49:03,840 Nếu tôi chỉ đưa ra sự bắt đầu? 1097 00:49:03,840 --> 00:49:05,380 Vâng, dấu chéo ngược bằng không, phải không? 1098 00:49:05,380 --> 00:49:08,800 Chỉ trong thời gian tuyến tính tôi có thể in ra với bản in def M-O-M. 1099 00:49:08,800 --> 00:49:11,820 Và ngay khi tôi nhìn thấy dấu gạch chéo ngược bằng không, tôi không quan tâm nơi tôi bắt đầu, 1100 00:49:11,820 --> 00:49:14,950 Tôi đã biết ngầm nơi tôi cần phải chấm dứt. 1101 00:49:14,950 --> 00:49:18,700 >> Và vì vậy hôm nay đánh dấu sự beginning-- và hãy để tôi làm điều này một cách đáng kể bởi vì chúng tôi 1102 00:49:18,700 --> 00:49:21,800 đã đi qua rất nhiều khó khăn để có được những huấn luyện ở đây wheels-- 1103 00:49:21,800 --> 00:49:29,840 vì vậy hôm nay các bánh xe bắt đầu đào tạo để thoát ra và chúng ta tiết lộ tại least-- 1104 00:49:29,840 --> 00:49:31,373 >> [Vỗ tay] 1105 00:49:31,373 --> 00:49:33,220 1106 00:49:33,220 --> 00:49:36,160 >> Điều đó cũng có giá trị chuyến đi Target sáng nay, có? 1107 00:49:36,160 --> 00:49:39,600 Vì vậy now-- có, nó quay ra, có những điều như chuỗi. 1108 00:49:39,600 --> 00:49:41,140 Chuỗi không tồn tại. 1109 00:49:41,140 --> 00:49:43,760 Đó là một từ đồng nghĩa rằng chúng ta đã có bên trong của thư viện CS50. 1110 00:49:43,760 --> 00:49:48,660 Từ nay trở đi, chúng ta sẽ bắt đầu cuộc gọi s và t không dây nhưng sao char. 1111 00:49:48,660 --> 00:49:51,180 Và ngôi sao char chúng tôi sẽ trêu chọc nhau trước khi dài. 1112 00:49:51,180 --> 00:49:53,510 Nhưng điều này là để nói, rằng ngay cả nếu chúng ta tiếp tục 1113 00:49:53,510 --> 00:49:56,180 sử dụng GetString cho bây giờ, về mặt kỹ thuật nên tôi 1114 00:49:56,180 --> 00:49:59,010 được nói sao char và char sao. 1115 00:49:59,010 --> 00:50:01,720 >> Và hóa ra những gì ngôi sao sẽ biểu thị một cái gì đó 1116 00:50:01,720 --> 00:50:04,340 được gọi là một con trỏ hoặc một địa chỉ. 1117 00:50:04,340 --> 00:50:06,110 Và trên thực tế, một lời trêu ghẹo cho những gì nằm phía trước 1118 00:50:06,110 --> 00:50:09,760 là 20 đoạn thứ hai này từ chúng tôi người bạn Nick Parlante tại Stanford 1119 00:50:09,760 --> 00:50:12,927 người, một số khá thời gian trước đây, chi tiêu một số tiền vô lý của thời gian, 1120 00:50:12,927 --> 00:50:15,010 là tốt nhất tôi có thể cho biết ông bếp hoặc tầng hầm của mình, 1121 00:50:15,010 --> 00:50:17,140 làm claymation giới thiệu với thế giới 1122 00:50:17,140 --> 00:50:20,010 một nhân vật tên Binky với người mà chúng tôi sẽ 1123 00:50:20,010 --> 00:50:22,010 được giới thiệu thời gian tới để con trỏ. 1124 00:50:22,010 --> 00:50:24,588 Vì vậy, đây là một bản xem trước của những gì sẽ đến. 1125 00:50:24,588 --> 00:50:26,370 >> [VIDEO PLAYBACK] 1126 00:50:26,370 --> 00:50:27,510 >> -Hey, Binky. 1127 00:50:27,510 --> 00:50:28,260 Thức dậy. 1128 00:50:28,260 --> 00:50:30,672 Đó là thời gian cho con trỏ của niềm vui. 1129 00:50:30,672 --> 00:50:31,616 >> -Cái gì thế? 1130 00:50:31,616 --> 00:50:33,032 Tìm hiểu về con trỏ? 1131 00:50:33,032 --> 00:50:34,450 Oh, hay qúa. 1132 00:50:34,450 --> 00:50:35,431 >> [END PLAYBACK] 1133 00:50:35,431 --> 00:50:38,055 DAVID J. Malan: Và lưu ý rằng, chúng ta sẽ thấy bạn vào ngày thứ Tư. 1134 00:50:38,055 --> 00:50:47,590 1135 00:50:47,590 --> 00:50:48,090 Được rồi. 1136 00:50:48,090 --> 00:50:48,740 Ai nhảy múa là? 1137 00:50:48,740 --> 00:50:49,240 Thôi nào. 1138 00:50:49,240 --> 00:50:50,330 Ai nhảy múa là? 1139 00:50:50,330 --> 00:50:51,820 Bạn muốn tôi để có được nó bắt đầu? 1140 00:50:51,820 --> 00:50:53,770 Tôi sẽ nhận được nó bắt đầu. 1141 00:50:53,770 --> 00:50:54,270 Woooo! 1142 00:50:54,270 --> 00:51:04,070 1143 00:51:04,070 --> 00:51:07,580 >> Lauren: Sweet Moses ưa thích.