[MUSIC CHƠI] 

SPEAKER 1: Được rồi, đây là CS50, và đây là sự bắt đầu của tuần thứ tư, và như bạn có thể đã nghe nói hoặc đọc, thế giới đã được kết thúc. Đi khắp nơi trên internet có được kiến ​​thức và nhận thức một lỗi trong một chương trình, một ngôn ngữ lập trình được gọi là Bash. Điều này đã được nhãn hiệu tuyệt vời như Shellshock, hoặc cửa Bash, nhưng bài viết như thế này đã không được phổ biến. Và trên thực tế, nhiều người trong số họ mang lại kỷ niệm sau của Heartbleed, mà bạn có thể nhận thấy trong nhấn trở lại vào mùa xuân vừa qua, mà tương tự là khá ấn tượng. Bây giờ của những người bạn ở đây ngày hôm nay, có bao nhiêu bạn có, ngay cả khi bạn không hiểu những gì đó là tất cả về, nghe nói về Shellshock? Được rồi, và có bao nhiêu bạn có máy tính dễ bị tổn thương? OK, có phải là xa, xa hơn tay lên ngay bây giờ, vì những lý do chúng ta sẽ thấy. 

Chúng ta hãy nhìn vào những gì là được diễn ra trong các phương tiện truyền thông và sau đó giải thích nó một chút ở đây cho chúng ta về mặt kỹ thuật. 

SPEAKER 2: chuyên gia bảo mật có cảnh báo rằng một lỗ hổng nghiêm trọng có thể là về ảnh hưởng đến hàng trăm hàng triệu người sử dụng web trên thế giới. Vì vậy, những gì chính xác là lỗi đó là được gọi là Shellshock, và những gì nó làm gì? Vâng, Shellshock còn được gọi là các Lỗi Bash, phần mềm khai thác nó. Tin tặc sử dụng virus để quét dễ bị tổn thương các hệ thống chạy Linux và Unix hệ điều hành và sau đó lây nhiễm cho họ. Bash là một vỏ dòng lệnh. Điều này cho phép người sử dụng vấn đề lệnh để khởi động chương trình và các tính năng trong phần mềm bằng cách gõ văn bản. Nó thường được sử dụng bởi các lập trình viên, và không nên mở cửa với thế giới rộng lớn hơn, mặc dù Shellshock thay đổi đó. 

Vâng, worringly, một số nhà phân tích cảnh báo nó có thể là một mối đe dọa lớn hơn, vì Shellshock cho phép hoàn thành kiểm soát của một máy tính bị nhiễm, trong khi chỉ được phép Heartbleed hacker gián điệp trên máy tính. Đó là quá nghiêm trọng, đó là được xếp hạng 10 trong số 10 cho mức độ nghiêm trọng của các quốc gia Cơ sở dữ liệu dễ bị tổn thương. 2/3 của tất cả các máy chủ web đang ở rủi ro, bao gồm cả một số máy tính Mac. Vâng, chắc chắn bạn vá các hệ thống của bạn bây giờ. Bất cứ ai lưu trữ một trang web chạy các hệ điều hành bị ảnh hưởng nên có hành động càng sớm càng tốt. Bất cứ ai có thể đủ khả năng đó nên xem xét để ứng dụng giám sát và các trang web của họ tường lửa để tìm cho ra bất kỳ cuộc tấn công. SPEAKER 3: Điều tồi tệ nhất có thể xảy ra là rằng ai đó sẽ viết mã sẽ tự động chuyển và quét Internet và sẽ ảnh hưởng đến tất cả các máy tính. Và một khi họ làm điều đó, tốt, điều tồi tệ nhất họ có thể làm chỉ là xóa tất cả mọi thứ, hoặc đóng cửa các trang web xuống. Vì vậy, chúng ta có thể nhìn thấy thiệt hại từ quan điểm đó, nơi chúng tôi sẽ có những người độc hại vừa quyết định gây ra tàn phá bằng cách đưa hệ thống giảm hoặc xóa Bức ảnh, và những thứ như thế. SPEAKER 2: Một số người nói đây là một trong trong những khó khăn nhất để đo lường lỗi trong năm, và nó có thể mất vài tuần hoặc thậm chí tháng để xác định tác động cuối cùng của nó. 

SPEAKER 1: Vì vậy, tất cả điều đó là sự thật, nhưng điều buồn cười là, hầu hết các của hình ảnh bạn thấy, ngoại trừ có lẽ bàn phím, không có gì để làm với lỗi nào. Máy chủ và dây điện và vân vân, nó liên quan đến loại tiếp tuyến, nhưng cốt lõi nó thực sự khá quen thuộc những gì đang xảy ra ở đây. Trong thực tế, hãy để tôi đi vào thiết bị CS50 của chúng tôi. Hãy để tôi đi trước và tối đa hóa cửa sổ thiết bị đầu cuối ở đây. Và các bạn đã được sử dụng này, hoặc phiên bản nhúng của chúng, trong gedit để viết chương trình, gõ lệnh, và vân vân, và điều này là thực sự, và có được trong nhiều tuần, Bash, B-A-S-H. Đây là Bourne-again shell, mà chỉ là một cách nói, đây là một chương trình có một nhấp nháy nhanh chóng, hiệu quả, mà ngồi đó chờ đợi cho đầu vào cho bạn. Và đó là lệnh giao diện dòng qua đó các bạn đã chạy lệnh và cuối cùng là biên dịch và sau đó chạy chương trình. 

Nhưng Bash cũng là một lập trình ngôn ngữ theo nghĩa sau đây. Bạn có biết rằng có những lệnh như cd và ls và cũng kêu vang và những người khác, nhưng bạn có thể xác định cho riêng mình bằng cách thực hiện chúng trong Bash. Bây giờ chúng ta sẽ không đi sâu vào chi tiết như Bash ngôn ngữ lập trình, nhưng biết, ví dụ, rằng tại thời điểm này, không có lệnh gọi là "hello". Vì vậy, nó có thể được tìm thấy trong một trong những gói này. Nó không phải được cài đặt trên máy tính của tôi. Yêu cầu quản trị của bạn. Nhưng nếu tôi muốn có được một chương trình gọi là "hello" trong Bash hoặc tại dấu nhắc của tôi, Tôi thực sự có thể sử dụng cú pháp đó là khá giống như C. Nó không phải hoàn toàn giống nhau, nhưng có vẻ khá giống với một chức năng, mặc dù thiếu một số chi tiết. Không có gì có thể xảy ra, nhưng bây giờ nếu tôi gõ "hello" bạn thực sự có thể viết một chương trình, không có trong C, không phải trong Java, không lập trình khác ngôn ngữ, nhưng trong Bash chính nó. 

Bây giờ chìa khóa ở đây là tôi đã viết Tôi muốn đặt tên cho lệnh mới này, và dấu ngoặc đơn cũng có biểu tượng này là một chức năng. Là một sang một bên, bạn cũng có thể làm niềm vui vật, và trên thực tế, ngay cả trên Mac OS, đây là một chương trình gọi là Terminal. Nó được xây dựng vào bất kỳ ai máy tính có một máy Mac trong căn phòng này, và bạn có thể làm điều tương tự trong Mac Hệ điều hành, nhưng bạn có thể đi nhiều hơn thế. Và đây là một chút tiếp tuyến, nhưng nó là loại thú vị. Tôi đã nhắc nhở sáng nay, khi nghĩ đến điều này thông qua, của một trò chơi nhỏ mà tôi sử dụng để chơi với một trong TF cựu của CS50 theo đó bất cứ lúc nào anh ấy sẽ đi bộ từ bàn phím của mình với màn hình mở khóa của mình, Tôi sẽ thực thi một lệnh như this-- "chào". Và bây giờ bất cứ lúc nào ông trở lại của mình bàn phím sau khi tôi xóa màn hình và ông sẽ ngồi xuống, cố gắng để làm một số công việc, liệt kê các nội dung của directory-- của mình 

[AUDIO xem lại] 

-Hello. Xin chào. 

SPEAKER 1: Vì vậy, trong công bằng, nó không thực sự "hello". Đó là một cái gì đó thường hơn giống như that-- [AUDIO xem lại] -Beep. SPEAKER 1: --that tôi would-- vì vậy máy tính của mình sẽ thề với anh bất cứ lúc nào ông thực sự ngồi xuống bàn phím của mình. Và rất nhanh chóng, ông đã tìm ra không rời khỏi màn hình của mình mở khóa. Tuy nhiên, điều này cho thấy các loại vui vẻ ngu ngốc mà bạn có thể có với một cái gì đó giống như Bash. Nhưng nó nhiều hơn một chút nghiêm trọng, để chắc chắn, hơn thế. Và trong thực tế, đây là một trong những hầu hết các lỗi nguy hiểm và lâu dài đã thực sự đạt thế giới trên toàn cầu. Lỗi này đã được khoảng đối với một số 20 năm, và bạn sẽ được đánh chỉ trong một thời điểm bởi sự đơn giản tương đối của nó. 

Vì vậy, đây là một đại diện lệnh rằng nếu bạn sở hữu một máy Mac, nghĩa là ngay bây giờ khi bạn có nắp mở, bạn có thể thử gõ vào đó chương trình gọi là Terminal. Thiết bị đầu cuối đang được Ứng dụng Utilities-- một lần, người dùng Windows không phải lo lắng về threat-- đặc biệt này nhưng những người bạn với máy Mac có thể gõ này vào cửa sổ như tôi sẽ làm ở đây, và nếu bạn gõ đó vào chương trình này được gọi là thiết bị đầu cuối, như tôi sẽ làm gì bây giờ, nếu bạn thấy từ "dễ bị tổn thương" máy tính của bạn dễ bị bóc lột. 

Bây giờ điều đó có thực sự nghĩa là gì? Và đây là thừa nhận một số cú pháp khá điên rồ, nhưng chúng ta ít nhất rút ra một số trong những khía cạnh thú vị. Vì vậy, có một số cú pháp giống một chút quen thuộc, ít nhất là từ C và lập trình nói chung. Tôi thấy một số dấu ngoặc đơn, dấu chấm phẩy, dấu ngoặc nhọn, và như vậy, nhưng nó quay ra rằng điều này điều ngu ngốc ở đây màu vàng về cơ bản là một chức năng mà không làm gì. Các phương tiện đại tràng không làm gì cả, và dấu chấm phẩy có nghĩa là dừng lại không làm gì. Vì vậy, bên trong các dấu ngoặc nhọn, thực tế rằng tôi có một bằng ký bên trái, điều này về cơ bản là tạo ra một lệnh, hoặc một biến, gọi là x, và gán cho nó đó chút màu vàng mã đó. Đó có thể là một cái gì đó giống như "echo hello "hay" nói tiếng bíp "hoặc một cái gì đó tương tự như vậy. Nhưng hãy chú ý nếu đôi mắt của bạn đi lang thang thêm vào bên phải, có nhiều đến dòng này hơn chỉ cuối dấu chấm phẩy. "Echo dễ bị tổn thương," và sau đó ngoài ra có nhiều hơn. Một dấu chấm phẩy, bash-c :. 

Vì vậy, câu chuyện dài ngắn, dòng mã này là đủ để hấp dẫn một máy tính đó là dễ bị tổn thương để làm một cái gì đó mà bạn muốn nó để làm, bởi vì có một lỗi trong Bash đó mặc dù Bash được cho là để ngăn chặn đọc dòng lệnh bên phải sau khi có văn bản màu vàng, cho một lỗi 20-cộng với tuổi, Bash đã thực sự được đọc ngoài dấu chấm phẩy và đẹp làm nhiều những gì nó nói. 

Vì vậy, ý nghĩa là những gì của mà cuối cùng? Tôi chỉ nói "echo hello" hoặc "echo dễ bị tổn thương" nhưng những gì nếu bạn đã làm một cái gì đó thực sự độc hại, như rm-rf *, mà bạn có thể không đã từng đánh máy trước, và bạn có thể thẳng thắn không nên quá sớm, bởi vì bạn có thể làm một rất nhiều thiệt hại với nó. Tại sao? rm làm những gì, tất nhiên? Loại bỏ. * Có nghĩa là gì? Tất cả. Vì vậy, nó là một cái gọi là thẻ hoang dã, do đó, nó có nghĩa là xóa mọi thứ trong thư mục hiện hành. r xảy ra có nghĩa là đệ quy, có nghĩa là nếu bạn đang xóa là một thư mục, và bên trong có là các tập tin và thư mục khác, đệ quy đi sâu vào có và xóa tất cả. Và f là tồi tệ nhất của tất cả. Bất cứ ai biết những gì f có nghĩa là ở đây? Force. Vì vậy, buộc phương tiện, thậm chí nếu điều này là một ý tưởng tồi, làm điều đó mà không nhắc tôi để xác nhận thêm. Vì vậy, bạn đã biết, chúng tôi cười này, nhưng thẳng thắn mà nói, tôi có thể loại này nhiều lần một ngày, bởi vì thực tế là đó là cách nhanh nhất để xóa một bó toàn bộ các công cụ. Nhưng ngay cả khi tôi đã làm một số thiệt hại. 

Nhưng nếu bạn để lừa một máy tính vào việc xác định một số biến ngu ngốc hoặc chức năng gọi là x, nhưng sau đó lừa máy tính vào thực hiện vượt ra ngoài ranh giới của đó chức năng, ngoài dấu chấm phẩy, bạn thực sự có thể lừa một máy tính vào thực hiện một cái gì đó giống như rm-rf hoặc lệnh Email hoặc lệnh Copy. Bất cứ điều gì nghĩa là bạn có thể làm với máy tính, cho dù đó là xóa các tập tin, tạo ra các tập tin, gửi thư rác một ai đó, tấn công một số máy chủ từ xa, nếu bạn có thể thể hiện nó với một lệnh, bạn có thể lừa một máy tính vào làm điều đó. 

Bây giờ một ví dụ về những gì làm thế nào bạn có thể làm điều này? Vâng, có rất nhiều máy tính Bash trên internet đang chạy. Tất cả người dùng Mac chúng tôi là trong số đó. Rất nhiều máy chủ Linux là một trong họ là tốt, và các máy chủ Unix. Windows một lần nữa được tương đối ra khỏi móc trừ khi bạn đã cài đặt phần mềm đặc biệt. Bây giờ rất nhiều máy chủ, cho Ví dụ, máy chủ web chạy, và trong thực tế Linux có lẽ là hầu hết các hệ điều hành phổ biến để chạy trên các máy tính trên internet được phục vụ lên các trang web. Bây giờ như chúng ta sẽ thấy sau này trong học kỳ, khi bạn gửi một yêu cầu từ browser-- Chrome của bạn, Internet Explorer, whatever-- đến một máy chủ từ xa, nó chỉ ra rằng mặc dù bạn chỉ cần gõ www.example.com, trình duyệt của bạn gửi một tin nhắn đó là nhiều hơn một chút phức tạp, như thế này. 

Nhưng hãy chú ý một chút gì đó kỳ lạ. Hai dòng đầu tiên Tôi chưa bao giờ thấy trước đây, nhưng họ không nhìn đặc biệt là đe dọa. Nhưng hãy chú ý những gì tôi đã bị đánh cắp cho dòng thứ ba ở đây. Nếu một kẻ xấu đã gửi một thông điệp như thế này từ máy tính của mình sang một máy Mac dễ bị tổn thương hoặc máy chủ Linux dễ bị tổn thương, điều buồn cười là Bash đó, đơn giản nhắc ít lệnh, là mặt ở khắp nơi và thường là được sử dụng chủ yếu để thực hiện nội dung của một thông điệp mà nó nhận được. Và theo logic đó, bạn có thể lừa một máy chủ web, do đó, bằng cách gửi một cái gì đó giống như User-Agent, mà thường là nghĩa vụ phải nói tên của trình duyệt của bạn. User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, điều này chỉ là trình duyệt của bạn cách để xác định chính nó. Nhưng nếu một kẻ xấu rất khéo léo nói, mm-mm, tôi sẽ không cho bạn biết những gì trình duyệt của tôi là, Tôi thay vì sẽ gửi cho bạn này khó hiểu, tìm kiếm việc bằng một rm-rf * Trong đó, bạn có nghĩa là có thể lừa một máy chủ web dễ bị tổn thương trên internet vào thực hiện một cách chính xác rằng trong có để xóa tất cả các file. Và thẳng thắn mà nói, đó không phải là thậm chí tồi tệ nhất của nó. Bạn có thể làm bất cứ điều gì. Bạn có thể bắt đầu một phân phối tấn công từ chối dịch vụ nếu bạn gửi thông điệp này đến toàn bộ chùm các máy chủ web và sau đó có tất cả chúng xuống, cho Ví dụ, trên các máy chủ Harvard.edu, và bạn có thể sắp xếp các bang quái trong số họ bởi một mạng lưới giao thông đó là nếu không kích hoạt bởi kẻ xấu này. 

Vì vậy, câu chuyện dài ngắn, gần như tất cả mọi người trong căn phòng này sở hữu một máy Mac là dễ bị tổn thương này. Các lớp lót bạc là trừ khi bạn chạy một máy chủ web trên máy tính xách tay của bạn, và trừ khi bạn đã thực sự cấu hình nó cho phép một cái gì đó giống như SSH vào nó, bạn thực sự an toàn. Đó là dễ bị tổn thương, nhưng không có một cố gắng để có được vào máy tính xách tay của bạn, vì vậy bạn có loại có thể yên tâm. Tuy nhiên, Apple sẽ sớm được cập nhật bản sửa lỗi cho việc này. Thế giới của Linux đã phát hành một số bản sửa lỗi cho Fedora và Ubuntu và phiên bản khác của Linux, và thực sự nếu bạn cập nhật 50 trong thiết bị, thậm chí cũng sẽ được cập nhật và sửa chữa. Nhưng đó cũng có không thực sự là dễ bị tổn thương, bởi vì trừ khi bạn đã tinkered với thiết bị này và làm cho máy tính xách tay của bạn công khai truy cập trên internet, mà không phải là theo mặc định, bạn đã thực sự được tốt vì của tường lửa và các kỹ thuật khác. 

Nhưng nó là một ví dụ điển hình của một lỗi mà chúng tôi đã sống cho đúng nghĩa đen 20 năm, và ai biết được nếu một người nào đó tất cả thời gian này đã được biết về nó? Và trên thực tế, đây là một trong những thách thức cơ bản rằng chúng ta sẽ thấy sau này trong học kỳ về an ninh, là giống như trong thế giới thực, người tốt đang ở thế bất lợi. Để giữ cho những kẻ xấu ra, chúng ta phải đảm bảo rằng tất cả các cánh cửa bị khóa, rằng tất cả các cửa sổ là an toàn, mà tất cả các điểm nhập cảnh vào một ngôi nhà là an toàn để giữ những kẻ xấu ra. Nhưng những gì kẻ xấu phải làm gì để thực sự thỏa hiệp nhà của bạn và ăn cắp từ bạn? Người đó chỉ cần có để tìm thấy một khóa cửa, một cửa sổ bị hỏng, hoặc một cái gì đó theo con đường này, và đó là điều tương tự trong bảo mật máy tính. Chúng tôi có thể viết hàng triệu dòng mã lập trình và chi tiêu hàng trăm hoặc hàng ngàn giờ cố gắng để làm cho nó chính xác, nhưng nếu bạn chỉ làm một sai lầm trong tính chính xác, bạn có thể đặt toàn bộ hệ thống và thực sự trong trường hợp này, toàn bộ internet và trên thế giới có nguy cơ. 

Vì vậy, nếu bạn muốn tìm hiểu thêm về điều này, đi đến URL này ở đây. Không cần phải hành động tối nay trừ khi bạn trong số những người cảm thấy thoải mái hơn đã được chạy web của riêng bạn máy chủ, trong trường hợp bạn cần mà, trên thực tế, cập nhật phần mềm của bạn. 

Và đây cũng là danh hiệu một bài phát biểu, và bây giờ là một giấy, mà chúng tôi đã liên kết trên trang web trình của ngày hôm nay. Đó là bởi một đồng nghiệp tên là Ken Thompson, người đã được chấp nhận rất nổi tiếng giải thưởng khoa học máy tính, và ông đã phát biểu này vài năm trước đây, chủ yếu là trên cùng một chủ đề. Hỏi folks câu hỏi, nên bạn thực sự tin tưởng, cuối cùng, phần mềm bạn đã được đưa ra? Ví dụ, tất cả chúng ta được viết chương trình, và chúng tôi đã biên soạn họ kêu vang. Và kiến ​​thức của bạn, bạn đã viết bất kỳ chương trình cho CS50 nơi có một cánh cửa trở lại của các loại, có một cách là một kẻ xấu, nếu chạy chương trình của bạn, có thể mất trên máy tính của bạn? Có lẽ là không, phải không? Mario, và tham lam, và tín dụng. Đây là tất cả các chương trình khá nhỏ. Bạn muốn có được khá xấu nếu bạn thực sự thực hiện toàn bộ máy tính của bạn dễ bị tổn thương sau khi viết 10 hoặc 20 dòng mã, hoặc ít nhất là không nhận thức được một số của tác động an ninh. Bây giờ tôi nói rằng bông lơn, nhưng chúng ta sẽ thấy ngày nay và trong tuần này nó thực sự thực sự, thực sự dễ dàng là xấu và làm cho ngay cả chương trình ngắn dễ bị tổn thương. 

Nhưng hiện nay, ít nhất, nhận ra là câu hỏi được hỏi ở đây là về kêu vang trong một trình biên dịch. Tại sao chúng tôi được tin tưởng kêu vang cho hai hoặc ba tuần qua? Ai nói rằng bất cứ ai đã viết kêu vang không có "nếu" điều kiện trong đó mà chủ yếu tiêm một số không và những người thân vào mỗi chương trình biên dịch mà có thể cho anh ta hoặc cô truy cập máy tính của bạn khi bạn đang ngủ và nắp máy tính xách tay của bạn đang mở và máy tính của bạn đang chạy? Phải không? Chúng tôi có loại này hệ thống danh dự bên phải tại nơi mà chúng tôi tin tưởng rằng kêu vang là VN. Bạn tin tưởng rằng thiết bị này là hợp pháp. Bạn tin tưởng rằng nghĩa đen mỗi chương trình trên máy Mac hoặc máy PC của bạn là đáng tin cậy. Và như lỗi đơn giản này cho thấy, thậm chí nếu nó không độc hại, đó là hoàn toàn không có thể là trường hợp. 

Vì vậy, bạn nên sợ hãi như là địa ngục. Thành thật mà nói, không có đơn giản giải pháp cho điều này khác hơn một loại nhận thức xã hội sự phức tạp ngày càng tăng mà chúng ta đang xây dựng trên hệ thống máy tính của chúng tôi, và làm thế nào ngày càng dễ bị tổn thương chúng tôi rất tốt có thể được. 

Bây giờ với những gì đã nói, Breakout. Vì vậy, Breakout là vấn đề thiết lập ba, và Breakout là một trò chơi từ năm qua mà bạn có thể nhớ lại, nhưng cho chúng ta trong vấn đề thiết lập ba, nó cho phép chúng tôi để có việc sao lưu một notch để khi chúng tôi đang viết chương trình, thậm chí trong một cửa sổ Terminal như thế này, chúng tôi thực sự có thể chạy, cuối cùng, các chương trình đồ họa không không giống như những gì chúng ta đã có truy cập vào trong Scratch. Vì vậy, đây là của nhân viên thực hiện Breakout, mà chỉ là này phá gạch trò chơi, mà bạn di chuyển paddle của bạn trở lại và ra, và bạn đánh bóng chống lại những viên gạch màu lên hàng đầu. Vì vậy, đây là mang lại cho chúng tôi loại trở lại nơi chúng tôi có thể rất nhanh chóng với Scratch, và bây giờ với C, thực hiện của chúng ta giao diện người dùng đồ họa. 

Nhưng hơn thế nữa, điều này vấn đề đại diện cho tập đầu tiên trong đó chúng ta đang đem lại cho bạn có một loạt các mã. Và trên thực tế, tôi mang lại cho rõ ràng ý đến điều này, bởi vì đặc biệt cho những người kém thoải mái, điều này vấn đề thiết lập, ít nhất là ở cái nhìn đầu tiên, sẽ cảm thấy như chúng tôi đã đưa nó lên một notch. Bởi vì chúng tôi đã đưa cho bạn, cho một số các tìm kiếm và phân loại các vấn đề trong pset, một loạt các mã mà chúng tôi đã viết, và một vài ý kiến mà nói "để làm" nơi bạn có để điền vào chỗ trống. Vì vậy, không quá đáng sợ, nhưng đó là lần đầu tiên chúng tôi trao cho bạn mã mà bạn cần lần đầu tiên đọc, hiểu, và sau đó thêm vào và hoàn thành nó. 

Và sau đó với Breakout, chúng ta sẽ làm như vậy, tạo cho bạn một vài chục dòng hơn mã đó, thẳng thắn, cung cấp cho bạn rất nhiều khuôn khổ cho các trò chơi nhưng dừng ngắn thực hiện những viên gạch và quả bóng và mái chèo, nhưng chúng tôi thực hiện một số tính năng khác. Và thậm chí là ở cái nhìn đầu tiên, một lần nữa, đặc biệt là nếu không thoải mái, có vẻ đặc biệt khó khăn và bạn nghĩ rằng có rất nhiều chức năng mới bạn cần để bọc tâm trí của bạn xung quanh, và đó là sự thật. Nhưng hãy nhớ, đó là khá giống như Scratch. Tỷ lệ cược là bạn không sử dụng tất cả các các mảnh ghép trong Scratch. Tỷ lệ cược là bạn không quan tâm để bọc tâm trí của bạn xung quanh tất cả chúng bởi vì tất cả nó đã là một Nhìn lướt qua để hiểu, oh, đó là những gì tôi có thể làm với mảnh ghép. Và quả thực, trong vấn đề thiết lập 3 spec, chúng tôi sẽ chỉ cho bạn tài liệu hướng dẫn mà sẽ giới thiệu với bạn một số chức năng mới, và cuối cùng là lập trình xây dựng bạn sử dụng. Điều kiện, vòng, biến, và các chức năng sẽ giống những gì chúng ta đã thấy cho đến nay. 

Vì vậy, trên thực tế, những gì chúng tôi sẽ cung cấp cho bạn là một số mẫu mã mà cho phép bạn tạo ra một cửa sổ không trông không giống như này, và cuối cùng biến nó thành một cái gì đó khá như thế này. Vì vậy, tận dụng lợi thế của CS50, thảo luận về giờ làm việc và nhiều hơn nữa, và chịu thoải mái trong thực tế là số lượng mã bạn phải viết thực sự là không phải tất cả những gì nhiều. Thách thức đầu tiên chỉ là để thích nghi mình để một số mã, chúng tôi đã viết. 

Bất kỳ câu hỏi về pset3, Shellshock, hay nói cách khác? 

TƯỢNG: Có vẻ như đi qua với Breakout rằng mã gần như một phong cách hướng đối tượng, nhưng tôi nghĩ rằng C là một hướng đối tượng chương trình. SPEAKER 1: Một câu hỏi tuyệt vời. Vì vậy, trong việc tìm kiếm thông qua các đang phân phối, các mã chúng tôi đã viết cho pset3, cho những người quen thuộc, nó Dường như đó là một ít đối tượng. Câu trả lời ngắn gọn là, nó được. Đó là một xấp xỉ của bạn như thế nào có thể làm mã hướng đối tượng sử dụng một ngôn ngữ như C, nhưng nó là vẫn còn cuối cùng là thủ tục. Không có phương pháp bên trong các biến, như bạn sẽ thấy. Nhưng đó là gợi nhớ về điều đó. Và chúng ta sẽ thấy tính năng này một lần nữa khi chúng tôi nhận được PHP và JavaScript vào cuối học kỳ. Nhưng hiện nay, nghĩ về nó như một gợi ý về những gì sắp tới. Câu hỏi. Tất cả các quyền. Vì vậy, sắp xếp hợp nhất là cách chúng tôi điều trái thời gian qua. Và sắp xếp hợp nhất đã được mát mẻ trong nghĩa là nó đã được nhanh hơn rất nhiều, ít nhất là dựa trên các bài kiểm tra lướt qua chúng tôi đã làm tuần trước, hơn, nói, bong bóng sắp xếp, lựa chọn sắp xếp, sắp xếp chèn. Và những gì đã được gọn gàng quá chỉ là cách ngắn gọn và sạch bạn có thể thể hiện nó. Và những gì chúng ta đã nói nó là một trên ràng buộc về thời gian chạy của hợp nhất sắp xếp? Vâng? 

TƯỢNG: n log n? 

SPEAKER 1: n log n, phải. n log n. Và chúng tôi sẽ trở lại với những gì mà thực sự có nghĩa là hoặc nơi xuất phát từ, nhưng điều này là tốt hơn so với những gì thời gian chạy mà chúng ta đã thấy cho bong bóng lựa chọn và sắp xếp chèn? Vì vậy, n bình phương. n bình phương lớn hơn này, và thậm chí nếu nó không hoàn toàn rõ ràng, biết rằng log n nhỏ hơn n, vì vậy nếu bạn làm n lần một cái gì đó nhỏ hơn n, nó sẽ được ít hơn n bình phương. Đó là một chút của trực giác đó. Nhưng chúng tôi đã phải trả giá cho việc này. Đó là nhanh hơn, nhưng một chủ đề mà bắt đầu xuất hiện trong tuần qua là sự cân bằng này. Tôi có hiệu suất tốt hơn thời gian khôn ngoan, nhưng những gì Tôi đã phải mất mặt khác tay, để đạt được điều đó? 

TƯỢNG: bộ nhớ. SPEAKER 1: Giả sử một lần nữa? TƯỢNG: bộ nhớ. SPEAKER 1: nhớ, hoặc không gian nói chung. Và đó không phải là siêu rõ ràng với con người của chúng tôi, nhưng nhớ lại rằng tình nguyện viên của chúng tôi đã bước về phía trước và bước trở lại như thể có một mảng ở đây, và như thể có một mảng thứ hai ở đây mà họ có thể sử dụng, bởi vì chúng tôi nơi nào cần thiết để kết hợp những folks. Chúng tôi không thể chỉ trao đổi chúng tại chỗ. Vì vậy, hợp nhất phân loại đòn bẩy là không gian hơn, chúng ta không cần có các thuật toán khác, nhưng ngược là nó nhanh hơn nhiều. Và thẳng thắn mà nói, trong không gian thế giới thực những RAM days--, đĩa cứng space-- là tương đối rẻ, và vì vậy đó là không nhất thiết phải là một điều xấu. 

Vì vậy, chúng ta hãy có một cái nhìn nhanh chóng, một chút nhiều phương pháp, những gì chúng tôi đã làm và tại sao chúng ta biết nó đã được n log n. Vì vậy, đây là những con số tám và các tám tình nguyện viên chúng tôi đã có thời gian qua. Và điều đầu tiên mà Merge Sắp xếp nói với chúng tôi phải làm là gì? TƯỢNG: Chia làm hai phần. SPEAKER 1: Giả sử một lần nữa? TƯỢNG: Chia làm hai phần. SPEAKER 1: Chia ra làm đôi, bên phải. Điều này là rất gợi nhớ danh bạ điện thoại, phân chia và chinh phục nói chung. Vì vậy, chúng ta nhìn vào nửa trái. Và một khi chúng tôi đã nói, sắp xếp nửa bên trái của các yếu tố, những gì chúng ta đã nói tới? Sắp xếp nửa trái của trái một nửa, trong đó cho phép chúng tôi, sau khi chia hai, tập trung vào bốn và hai. 

Làm thế nào để sắp xếp một danh sách bây giờ, trong màu vàng, kích thước hai, sử dụng Merge theo? Cũng chia một nửa, và sắp xếp các nửa trái. Và đây là nơi mà mọi thứ có một chút ngu ngốc một thời gian ngắn. Làm thế nào để sắp xếp một danh sách đó là của kích thước một, giống như con số này bốn ở đây? Nó được sắp xếp. Bạn đang thực hiện. 

Nhưng sau đó làm thế nào để sắp xếp một danh sách kích thước một khi đó là số hai? Vâng, điều tương tự, nhưng bây giờ đã được những gì thứ ba và các bước quan trọng trong Merge theo? Bạn phải nhập trái một nửa và nửa bên phải. Và một khi chúng ta đã làm điều đó, chúng tôi đã tại bốn, chúng tôi nhìn hai. Chúng tôi quyết định rồi, rõ ràng là hai đến trước, vì vậy chúng tôi đặt hai trong của nó vị trí, kèm theo bốn. Và bây giờ bạn phải loại tua lại, và đây là loại đặc trưng của một thuật toán như Merge Sắp xếp, tua lại trong bộ nhớ. Dòng tiếp theo của câu chuyện là gì? Những gì tôi nên tập trung vào tiếp theo? Nửa bên phải của trái một nửa, nào là sáu và tám. 

Vì vậy, hãy để tôi bước qua này mà không belaboring điểm quá nhiều. Sáu và tám, sau đó sáu là sắp xếp, tám được sắp xếp. Kết hợp chúng lại với nhau như thế, và bây giờ là bước tiến lớn tiếp theo được, tất nhiên, sắp xếp nửa bên phải từ bước đầu tiên của thuật toán này. Vì vậy, chúng tôi tập trung vào một, ba, bảy, năm. Sau đó chúng tôi tập trung vào nửa trái. Nửa bên trái đó, nửa bên phải của đó, và sau đó hợp nhất trong một và ba. Sau đó, nửa bên phải, sau đó còn lại một nửa của nó, sau đó nửa bên phải của nó. Kết hợp nó vào, và bây giờ những gì bước vẫn còn? Hợp nhất nửa trái lớn và lớn nửa bên phải, vì vậy người ta đi xuống đó, sau đó hai, rồi ba, rồi bốn, sau đó năm, sau đó sáu, sau đó bảy, sau đó tám. 

Vì vậy, bây giờ tại sao điều này cuối cùng được tiết lộ, đặc biệt là nếu n và logarit hơn nói chung chứ không phải thoát khỏi bạn, ít nhất là trong thời gian gần đây? Vâng, chú ý đến chiều cao của điều này. Chúng tôi đã có tám yếu tố, và chúng tôi chia nó bằng hai, hai, bởi hai. Vì vậy, cơ sở đăng nhập hai trong số tám cho chúng ta ba. Và tin tưởng tôi về điều đó nếu một chút mơ hồ về điều đó. Tuy nhiên, cơ sở đăng nhập hai tám là ba, vì vậy chúng tôi đã làm ba lớp sáp nhập. Và khi chúng tôi sáp nhập yếu tố, bao nhiêu yếu tố chúng tôi đã nhìn vào mỗi người hàng? Tổng cộng có n, phải không? Bởi vì để hợp nhất hàng đầu, mặc dù chúng tôi đã làm trọn vẹn, cuối cùng chúng ta chạm vào mỗi số một lần. Và trong hàng thứ hai, để kết hợp những danh sách kích thước hai, chúng tôi đã chạm vào từng yếu tố một lần. Và sau đó ở đây thực sự rõ ràng ở hàng cuối cùng, chúng tôi đã phải chạm vào nhau của những các yếu tố một lần, nhưng chỉ một lần, vì vậy đây nằm, sau đó, chúng tôi n log n. 

Và bây giờ chỉ để làm cho mọi việc một chút nhiều chính thức chỉ là một khoảnh khắc, nếu bạn là đến nay phân tích này tại một loại mức độ cao hơn và cố gắng để quyết định, tốt như thế nào bạn có thể đi về thể hiện thời gian chạy của thuật toán này chỉ cần nhìn vào nó và không bằng cách sử dụng một ví dụ giả tạo? Vâng, bao nhiêu thời gian bạn có thể nói một bước như thế này trong màu vàng sẽ mất, nếu n <2 trở lại? Đó là một O lớn của những gì? Vì vậy, tôi đang nhìn thấy một, vì vậy một bước, có lẽ hai bước bởi vì nó nếu và sau đó quay trở lại, nhưng nó thời gian liên tục, phải không? Vì vậy, chúng tôi đã nói O (1), và đó là làm thế nào tôi sẽ thể hiện điều này. T, chỉ cần thời gian chạy. n là kích thước của đầu vào, nên T (n), chỉ là một cách ưa thích nói rằng các hoạt động thời gian đầu vào cho kích thước n là có được về trình tự thời gian liên tục, trong O (1). 

Nhưng nếu không, những gì về điều này? Làm thế nào bạn sẽ thể hiện thời gian của dòng màu vàng này chạy? T của những gì? Bạn có thể loại gian lận ở đây và trả lời câu hỏi của tôi theo chu kỳ. Vì vậy, nếu thời gian chạy trong Nhìn chung, chúng tôi chỉ nói là T (n). Và bây giờ bạn đang loại punting đây nói, tốt, chỉ cần sắp xếp một nửa trái, và sau đó sắp xếp nửa bên phải. Làm thế nào chúng ta có thể biểu tượng đại diện cho thời gian chạy của dòng màu vàng này? T của những gì? Kích thước của đầu vào là gì? n hơn hai. Tại sao tôi không chỉ nói rằng? Và sau đó đây là một T (n / 2) và sau đó một lần nữa, nếu tôi kết hợp hai nửa đã được sắp xếp, có bao nhiêu yếu tố tôi sẽ phải chạm tổng? n. Vì vậy, tôi có thể thể hiện điều này, chỉ là loại ưa thích, như thời gian chạy nói chung. T (n) chỉ là thời gian chạy của T (n / 2), cộng với T (n / 2), còn lại một nửa và nửa bên phải, cộng với O (n), mà có lẽ là bước n, nhưng có lẽ, nếu tôi đang sử dụng hai ngón tay, nó nhiều gấp đôi bước, nhưng đó là tuyến tính. Đó là một số bước đó là một yếu tố của n, vì vậy chúng tôi có thể thể hiện điều này vì điều này. Và đây là nơi mà bây giờ chúng ta sẽ đá trái banh vào sau của sách giáo khoa toán trường trung học của chúng tôi chúng tôi là tái phát cuối cùng kết thúc bằng này, n lần đăng nhập n, nếu bạn thực sự làm ra toán học chính thức hơn. 

Vì vậy, đó chỉ là hai quan điểm. Một số lượng với một mã hóa cứng ví dụ đại diện sử dụng tám con số, và nhiều hơn nữa nhìn chung như thế nào, chúng tôi đã có. Nhưng những gì thực sự thú vị ở đây là, một lần nữa, khái niệm này của xe đạp. Tôi không sử dụng cho các vòng. Tôi là loại xác định một cái gì đó về bản thân, không chỉ với điều này chức năng toán học, mà còn về mã giả này. Mã giả này là đệ quy trong đó hai dây chuyền của nó cơ bản là nói cho nó đi sử dụng nó để giải quyết một nhỏ hơn vấn đề kích thước nhỏ hơn, và sau đó một lần nữa và một lần nữa và một lần nữa cho đến khi chúng nó bớt xuống cái gọi là trường hợp cơ sở này. 

Vì vậy, hãy thực sự rút ra một hấp dẫn hơn take-away từ này như sau. Hãy để tôi đi vào gedit và tham gia một xem xét một số mã nguồn của ngày hôm nay, đặc biệt là ví dụ này ở đây. Sigma 0, mà dường như thêm số một đến n. Vì vậy, chúng ta hãy xem những gì quen thuộc và không quen thuộc ở đây. Trước tiên chúng ta có một vài bao gồm, vì vậy không có gì mới ở đó. Nguyên mẫu. Tôi là một chút mơ hồ về này sau vài ngày, nhưng những gì chúng ta đã nói một nguyên mẫu của một chức năng là gì? TƯỢNG: [không nghe được]. SPEAKER 1: Cái gì thế? TƯỢNG: Chúng tôi thông báo nó. SPEAKER 1: Chúng tôi thông báo nó. Vì vậy, bạn đang giảng dạy kêu vang, hey, không thực sự thực hiện điều này chưa, nhưng đâu đó trong tập tin này, có lẽ, sẽ được một chức năng gọi là gì? Sigma. Và đây chỉ là một lời hứa nó sẽ giống như thế này. Nó sẽ mất một số nguyên như input-- và tôi có thể được rõ ràng hơn và nói int n --and nó sẽ trả lại một int, nhưng có nghĩa là dấu chấm phẩy, mm, tôi sẽ nhận được xung quanh để thực hiện điều này một chút sau đó. Một lần nữa, kêu vang là câm. Nó sẽ chỉ biết những gì bạn nói với nó trên xuống dưới, vì vậy chúng tôi cần ít nhất là cho nó là một gợi ý về những gì sắp tới. 

Bây giờ chúng ta hãy nhìn vào chính ở đây. Hãy di chuyển xuống đây và xem những gì chính đang làm. Nó không phải là dài của một chức năng, và trong thực tế xây dựng ở đây là quen thuộc. Tôi tuyên bố một biến n, và sau đó Tôi làm phiền người sử dụng một lần nữa và một lần nữa cho một số nguyên dương sử dụng getInt, và chỉ thoát ra khỏi vòng lặp này một khi người dùng đã tuân thủ. Trong khi làm, chúng tôi đã sử dụng để sự chấp thuận của người sử dụng theo cách đó. Bây giờ đây là thú vị. Tôi tuyên bố một int gọi là "câu trả lời." Tôi gán cho nó giá trị trả về của một chức năng được gọi là "sigma". Tôi không biết những gì mà không nêu ra, nhưng Tôi nhớ tuyên bố nó vừa mới đây. Và sau đó tôi đi qua trong giá trị mà người dùng gõ vào, n, và sau đó tôi báo cáo câu trả lời. Vâng chúng ta hãy di chuyển trở lại chỉ trong một thời điểm. Chúng ta hãy đi trước vào thư mục này, hãy sigma 0, và thực sự chạy chương trình này và xem những gì sẽ xảy ra. Vì vậy, nếu tôi đi trước và chạy chương trình này, ./sigma-0, và tôi gõ vào một tích cực số nguyên như hai, Sigma, là biểu tượng của Hy Lạp có nghĩa, chỉ là sẽ thêm lên tất cả các số điện thoại từ số không vào đến hai. Vì vậy, 0 cộng với 1 cộng với 2. Vì vậy, đây hy vọng sẽ cho tôi 3. Đó là tất cả nó làm. Và tương tự, nếu tôi chạy này một lần nữa và tôi cho nó thứ ba, đó là 3 cộng với 2, vì vậy đó là 5, cộng với 1 nên cho tôi 6. Và sau đó nếu tôi nhận được thực sự điên rồ và bắt đầu gõ vào con số lớn hơn, nó sẽ cho tôi lớn hơn và lớn hơn số tiền. Vì vậy, đó là tất cả. 

Vì vậy, những gì sigma như thế nào? Vâng, đó là khá dễ dàng. Đó là cách mà chúng ta có thể đã thực hiện này trong vài tuần qua. "Int" là có được kiểu trả về. Sigma là tên, và phải mất một m biến thay vì n. Tôi sẽ thay đổi điều đó lên hàng đầu. Sau đó, đây chỉ là một kiểm tra sanity. Chúng ta sẽ thấy lý do tại sao trong một thời điểm. Bây giờ tôi tuyên bố một biến khác, Tóm lại, khởi tạo nó bằng không. Sau đó, tôi có điều này Đối với loop lặp lại, rõ ràng cho rõ ràng, từ i = 1 trên lên đến một = m, đó là bất cứ điều gì người dùng gõ vào, và sau đó tôi tăng số tiền như thế này. Và sau đó trả lại số tiền. 

Vì vậy, một vài câu hỏi. Một, tôi yêu cầu bồi thường trong bình luận của tôi rằng điều này tránh nguy cơ của một vòng lặp vô hạn. Tại sao đi qua trong một số âm gây ra, có khả năng, một vòng lặp vô hạn? 

TƯỢNG: Bạn sẽ không bao giờ đạt m. 

SPEAKER 1: Không bao giờ đạt m. Nhưng m được thông qua tại, vì vậy hãy xem xét một ví dụ đơn giản. Nếu m được thông qua tại các sử dụng như là một tiêu cực. Không phân biệt chính. Chính bảo vệ chúng ta khỏi này quá, vì vậy tôi chỉ thực sự là đường hậu môn với sigma để cũng đảm bảo rằng các đầu vào không thể phủ định. Vì vậy, nếu m là tiêu cực, cái gì đó như một tiêu cực. Điều gì sẽ xảy ra? Vâng, tôi sẽ được khởi tạo một, và sau đó tôi sẽ là nhỏ hơn hoặc bằng m? 

Stand by. Đó was-- chúng ta không, hãy đụng tới câu chuyện này. Tôi đã không hỏi câu hỏi đó, bởi vì nguy cơ mà tôi đang ám chỉ đến sẽ không xảy ra, vì tôi là luôn luôn lớn than-- OK, Tôi rút lại câu hỏi đó. OK. Hãy chỉ tập trung vào phần này ở đây. Tại sao tôi lại khai báo một số bên ngoài vòng lặp? Thông báo trên dòng 49 tôi đã tôi tuyên bố bên trong vòng lặp, nhưng trực tuyến 48 tôi đã tuyên bố một số bên ngoài. Yeah. TƯỢNG: [không nghe được]. SPEAKER 1: Chắc chắn. Vì vậy, đầu tiên và quan trọng nhất tôi chắc chắn không muốn khai báo và khởi tạo tổng hợp để không bên trong vòng lặp trên mỗi lần lặp, vì điều này sẽ đánh bại rõ Mục đích của việc tổng hợp các con số. Tôi sẽ tiếp tục thay đổi giá trị trở lại bằng không. Và cũng có thể, những gì khác phức tạp hơn Lý do cho rằng quyết định thiết kế giống nhau không? Yeah. 

TƯỢNG: [không nghe được]. SPEAKER 1: Chính xác. Tôi muốn truy cập nó bên ngoài của vòng lặp quá về những gì dòng? Trên 53. Và dựa trên quy tắc của ngón tay cái của chúng tôi từ một vài bài giảng trước đây, biến được scoped, thực sự, đến dấu ngoặc nhọn mà bao gồm họ. Vì vậy, nếu tôi không khai báo số tiền bên trong các dấu ngoặc nhọn bên ngoài, Tôi không thể sử dụng nó trong dòng 53. Nói cách khác, nếu tôi tuyên bố tổng hợp ở đây, hoặc thậm chí trong Đối với loop, tôi không thể truy cập nó trong 53. Các biến có hiệu quả sẽ được đi. Vì vậy, một vài lý do đó. Nhưng bây giờ chúng ta hãy quay trở lại và xem những gì sẽ xảy ra. Vì vậy, sigma được gọi là. Nó cho biết thêm lên 1 cộng với 2, hoặc 1 cộng với 2 cộng với 3, và sau đó trả về giá trị, lưu trữ nó trong câu trả lời, và printf đây là lý do tại sao tôi nhìn thấy trên màn hình. Vì vậy, đây là những gì chúng tôi sẽ gọi lặp đi lặp lại phương pháp tiếp cận, nơi mà chỉ lặp đi lặp lại nghĩa là sử dụng một vòng lặp. Một Đối với loop, một vòng lặp Trong khi đó, một Do Trong khi vòng lặp, chỉ cần làm một cái gì đó một lần nữa và một lần nữa và một lần nữa. 

Nhưng sigma là loại một chức năng gọn gàng trong mà tôi có thể thực hiện nó một cách khác nhau. Gì về điều này, mà chỉ để được loại mát mẻ, cho tôi thực sự thoát khỏi của rất nhiều phân tâm bởi vì chức năng này thực sự là khá đơn giản. Hãy bớt nó xuống chỉ đến bốn dòng cốt lõi của nó và để loại bỏ tất cả các ý kiến ​​và dấu ngoặc nhọn. Đây là loại một tâm-thổi thực hiện thay thế. Được rồi, có lẽ không quan tâm-thổi, nhưng nó là loại hấp dẫn hơn, tất cả các bên phải, xem xét điều này rất nhiều ngắn gọn hơn. Với chỉ bốn dòng mã, Đầu tiên tôi có kiểm tra sanity này. Nếu m là nhỏ hơn hoặc bằng bằng không, sigma làm cho không có ý nghĩa. Nó chỉ có nghĩa vụ phải được trong trường hợp này cho các số dương, vì vậy tôi chỉ cần đi để trở lại không tùy tiện để chúng tôi ít nhất có một số cái gọi là trường hợp cơ sở. 

Nhưng ở đây là vẻ đẹp. Toàn bộ ý tưởng này, thêm số từ 1 đến n, m hoặc trong trường hợp này, có thể được thực hiện bằng cách loại đi qua các buck. Vâng, số tiền từ 1 đến m là gì? Vâng, bạn biết gì không? Điều này tương tự như tổng của m cộng với số tiền từ 1 đến m trừ đi 1. Vâng, bạn biết gì không? Sigma của m trừ đi 1 là gì? Vâng, nếu bạn loại theo điều này một cách hợp lý, nó giống như m trừ đi 1 cộng với sigma của m trừ đi 2. Vì vậy, bạn có thể loại just-- này là như thế, nếu bạn chỉ cố gắng để làm phiền một người bạn và họ hỏi bạn một câu hỏi, bạn loại phản ứng với một câu hỏi, bạn có thể loại tiếp tục đi qua các buck. Nhưng điều quan trọng là nếu bạn tiếp tục làm cho các câu hỏi nhỏ hơn và nhỏ hơn và nhỏ hơn, bạn không yêu cầu sigma là những gì n, sigma của những gì n, sigma của n là gì? Bạn đang yêu cầu những gì sigma của n, sigma là những gì n trừ đi 1, sigma n trừ đi 2 là gì? Cuối cùng, câu hỏi của bạn sẽ trở thành những gì? Sigma của một hoặc là gì bằng không, một số giá trị rất nhỏ, và ngay sau khi bạn nhận được rằng, bạn của bạn, bạn sẽ không hỏi cùng một câu hỏi một lần nữa, bạn chỉ cần đi để nói, oh nó không. Chúng tôi thực hiện xong việc này ngu ngốc trò chơi mang tính chu kỳ. 

Vì vậy, đệ quy là hành động trong lập trình một chức năng gọi điện thoại riêng của mình. Chương trình này, khi biên dịch và chạy, là sẽ hành xử một cách chính xác theo cùng một cách, nhưng những gì quan trọng là bên trong của một hàm gọi là sigma, có một dòng mã trong đó chúng tôi đang kêu gọi chúng ta, mà thông thường sẽ là xấu. Ví dụ, nếu tôi đầu tiên biên soạn này, do đó hãy sigma-- làm cho sigma 1 ./sigma-1. Số nguyên dương, xin vui lòng, 50 năm 1275. Vì vậy, những gì các chức năng dường như được, dựa trên một thử nghiệm, chính xác. Nhưng nếu tôi có được một chút nguy hiểm và xóa cái gọi là trường hợp cơ sở, và chỉ cần nói, tôi cũng chỉ cần làm này phức tạp hơn nó được. Hãy chỉ tính sigma bằng cách lấy m và sau đó thêm trong sigma của m trừ một? Vâng, những gì sẽ xảy ra đây? Hãy thu nhỏ. Chúng ta hãy biên dịch lại chương trình, lưu nó, biên dịch chương trình, và sau đó sẵn sàng ./sigma-1 phóng to, nhập số nguyên dương xin vui lòng, 50. Có bao nhiêu bạn sẵn sàng để fess lên để nhìn thấy điều đó không? 

OK. Vì vậy, đây có thể xảy ra một số lý do, và thẳng thắn trong tuần này chúng tôi về cung cấp cho bạn nhiều trong số họ. Nhưng trong trường hợp này, hãy thử với lý do ngược những gì có thể đã xảy ra ở đây? Lỗi phân khúc, chúng tôi đã nói cuối cùng thời gian, đề cập đến một phân đoạn của bộ nhớ. Một cái gì đó không hay xảy ra. Nhưng đó là gì máy móc đó đã bị thất bại ở đây vì loại bỏ tôi đó được gọi là trường hợp cơ sở, nơi tôi trở về một giá trị mã hóa cứng? Bạn nghĩ gì đã xảy ra? Yeah. 

TƯỢNG: [không nghe được]. SPEAKER 1: Ah. Câu hỏi. Vì vậy, kích thước của số mà tôi đã được tổng hợp đã quá lớn mà nó vượt quá kích thước của không gian bộ nhớ. Ý tưởng tốt, nhưng về cơ bản không sẽ gây ra một vụ tai nạn. Điều đó có thể gây ra tràn số nguyên, nơi các bit chỉ cần lật qua và sau đó chúng ta nhầm lẫn một thực sự lớn số cho giống như một số âm, nhưng chính nó sẽ không gây ra một vụ tai nạn. Bởi vì ở cuối của ngày một int vẫn là 32 bit. Bạn sẽ không vô tình ăn cắp một chút 33. Nhưng một ý nghĩ tốt. Yeah. 

TƯỢNG: [không nghe được]. SPEAKER 1: Phương pháp không bao giờ ngừng chạy, và thực sự nó gọi chính nó một lần nữa và một lần nữa và một lần nữa và một lần nữa và một lần nữa, và không ai trong số những chức năng bao giờ hoàn thành vì dòng duy nhất của họ mã gọi themself một lần nữa và một lần nữa và một lần nữa. Và những gì thực sự xảy ra ở đây, và bây giờ chúng tôi có thể loại vẽ những bức tranh này. Hãy để tôi đi qua một hình ảnh chỉ trong một thời điểm. Đây là một hình ảnh, mà cuối cùng sẽ xác thịt ra chi tiết hơn về những gì đang xảy ra bên trong bộ nhớ máy tính của bạn. Và nó chỉ ra rằng trên dưới cùng của hình ảnh này là một cái gì đó gọi là chồng. Đây là một đoạn bộ nhớ, một đoạn của bộ nhớ RAM, đó là chỉ được sử dụng bất cứ lúc nào một chức năng được gọi. Bất cứ lúc nào, một lập trình viên, gọi một chức năng, hệ điều hành, như Mac OS, Windows, Linux, lấy một loạt các byte, có thể là một vài kilobyte, có thể vài MB bộ nhớ, bàn tay họ cho bạn, và sau đó cho phép bạn chạy chức năng của bạn bằng cách sử dụng bất cứ điều gì biến bạn cần. Và nếu bạn sau đó gọi khác chức năng và chức năng khác, bạn nhận được một phần của bộ nhớ và một phần của bộ nhớ. 

Và quả thực, nếu các khay màu xanh lá cây từ Annenberg đại diện cho bộ nhớ, đây là những gì sẽ xảy ra đầu tiên khi bạn gọi chức năng sigma. Nó giống như đặt một khay như thế này về những gì ban đầu một ngăn xếp rỗng. Nhưng sau đó nếu khay tự gọi mình, có thể nói, gọi điện thoại dụ khác sigma, đó là như yêu cầu hệ điều hành, ooh, cần một ít bộ nhớ hơn, cho tôi đó. Và sau đó nó được chất đống trên trên đầu trang. Nhưng mấu chốt ở đây là khay đầu tiên vẫn còn đó, bởi vì anh ta gọi khay thứ hai này. Bây giờ trong khi đó, sigma gọi sigma, đó là như yêu cầu bộ nhớ hơn. Được chất đống trên đây. sigma gọi sigma, đó là một khay đó được chất đống ở đây. Và nếu bạn tiếp tục làm điều này, cuối cùng, loại bản đồ hình ảnh này biểu đồ rằng, những gì đang xảy đến xảy ra với chồng khay? Nó sẽ vượt quá số tiền bộ nhớ máy tính của bạn. Và ngay khi khay màu xanh lá cây này vượt quá đường ngang trên stack và trên đống từ, mà chúng tôi sẽ quay trở lại trong tương lai, đó là một điều xấu. Heap là một khác nhau phân đoạn của bộ nhớ, và nếu bạn để cho các khay cọc và đống trên, bạn sẽ vượt quá phân khúc của riêng bạn của bộ nhớ, và một chương trình thực sự sẽ sụp đổ. 

Bây giờ là một sang một bên, ý tưởng này đệ quy, do đó, có thể dẫn đến các vấn đề rõ ràng, nhưng nó không nhất thiết phải là một điều xấu. Bởi vì xem xét, sau khi tất cả, và có thể how-- này có một số nhận được sử dụng để --how thanh lịch hoặc cách đơn giản việc thực hiện của sigma là. Và chúng tôi sẽ không sử dụng đệ quy tất cả những gì nhiều trong CS50, nhưng trong CS51, và thực sự bất kỳ lớp học nơi bạn thao tác cấu trúc dữ liệu như cây, hoặc cây gia đình, có một số hệ thống phân cấp, đó là siêu, siêu hữu ích. Bây giờ, khi một sang một bên, để bạn như tham vọng các nhà khoa học máy tính đã quen thuộc với một số của Google đùa bên trong, nếu bạn đi đến Google và bạn tìm kiếm những gì là định nghĩa, nói rằng, đệ quy, nhập. Uh-huh. Là một sang một bên, tôi kéo lên một vài. Điều này giống như 10 phút sự trì hoãn sáng nay. Nếu bạn cũng Google "lệch", thông báo bằng cách nghiêng đầu của bạn slightly-- và sau đó một điều này có lẽ tồi tệ nhất của tất cả các kể từ khi một người nào đó đã như ngày của họ thực hiện điều này một số năm ago-- nào. Oh, wait-- đó là một lỗi. 

Vì vậy, chạy trên một trong những các trang web lớn nhất thế giới là những ít trứng Phục sinh ngu ngốc. Họ có thể tiêu thụ một số không tầm thường của dòng mã chỉ để chúng tôi có thể có những điều thú vị nhỏ nhặt như thế. Nhưng ít nhất bây giờ bạn có một số những câu chuyện cười bên trong. 

Bây giờ chúng ta hãy có một cái nhìn tại một số các trắng nằm chúng tôi đã nói về muộn, và bắt đầu lột vỏ trở lại một số lớp kỹ thuật để bạn thực sự hiểu những gì đã xảy ra và bạn có thể hiểu một số các mối đe dọa, như Shellshock, mà bây giờ đã bắt đầu để trở thành vào vị trí hàng đầu của tất cả mọi người của sự chú ý, ít nhất là trong các phương tiện truyền thông. Vì vậy, đây là một chức năng rất đơn giản trả về không có gì, có hiệu lực. Tên của nó là trao đổi. Phải mất trong hai biến và nó trả về không có gì. Đưa vào a và b. Vì vậy, một cuộc biểu tình nhanh chóng. Chúng tôi mang những lên. Chúng tôi cũng có thể mất một ít phá vỡ ở đây chỉ một khoảnh khắc và có một chút gì đó để uống. Nếu một người nào đó sẽ không nhớ tham gia tôi lên đây để chỉ một khoảnh khắc. Làm thế nào về bạn trong màu áo nâu? Nào lên. Chỉ cần một ngày hôm nay. Cảm ơn bạn, mặc dù. Được rồi, và chúng tôi có sắp tới những người ở đây? Tên của bạn là gì? 

SPEAKER 4: Laura. 

SPEAKER 1: Laura. Nào lên. Vì vậy, Laura, thách thức rất đơn giản ngày hôm nay. Rất vui được gặp yo. Tất cả các quyền. Vì vậy, chúng tôi có một số sữa ở đây và chúng tôi có một số nước cam ở đây và vài cái cốc mà chúng ta vay mượn từ Annenberg ngày hôm nay. 

SPEAKER 4: vay. SPEAKER 1: Và sẽ đi trước và cung cấp cho bạn một nửa ly này. Tất cả các quyền. Và chúng tôi sẽ cung cấp cho bạn một nửa một ly sữa. Oh, và chỉ để bạn có thể nhớ những gì này là như thế nào, Tôi nhớ mang điều này và ngày hôm nay. Được rồi. Nếu bạn không quan tâm, chúng ta hãy xem, chúng tôi có thể đặt chúng trên kính của riêng bạn nếu bạn muốn. Đây sẽ là thế giới từ đôi mắt của Laura. Tất cả các quyền. Vì vậy, mục tiêu của bạn, có hai ly chất lỏng ở đây, sữa và nước cam, được trao đổi hai nội dung để các nước cam đi vào cốc sữa và sữa đi vào cốc nước cam. 

SPEAKER 4: Tôi có được cốc khác? SPEAKER 1: Tôi rất vui vì bạn đã hỏi, mặc dù nó đã có cảnh quay tốt hơn nhiều nếu bạn đã không hỏi. Nhưng có, chúng tôi có thể cung cấp cho bạn một phần ba cốc đó là trống rỗng, tất nhiên. Tất cả các quyền. Vì vậy, trao đổi các nội dung đó. Rất tốt đẹp. Rất tốt. Bạn đang làm điều này khá cẩn thận. Và bước ba. Tất cả các quyền. Tuyệt vời. Một tràng pháo tay sẽ là tốt cho Laura. Tất cả các quyền. Chúng tôi có một món quà chia tay ít cho bạn, nhưng hãy để tôi có những. Cảm ơn bạn rất nhiều. Vì vậy, một ví dụ đơn giản, tuy nhiên, để chứng minh rằng nếu bạn làm muốn trao đổi các nội dung của hai container, hoặc hãy gọi cho họ biến, bạn cần một số lưu trữ tạm thời đến giai đoạn một trong các nội dung trong quá mà bạn thực sự có thể làm trao đổi. Vì vậy, trên thực tế, nguồn này đang lên ở đây trong C là đại diện chính xác điều đó. Nếu nước cam là một và sữa là b, và chúng tôi muốn trao đổi hai, bạn có thể thử một cái gì đó sáng tạo bằng cách đổ một trong những thành khác, nhưng mà có lẽ sẽ không kết thúc đặc biệt tốt. Và vì vậy chúng tôi sử dụng một cốc thứ ba, cuộc gọi nó tmp, T-M-P theo quy ước, và đưa các nội dung của OJ trong đó, sau đó trao đổi một ly, sau đó đặt OJ vào ly ban đầu, do đó đạt được, chính xác như Laura đã làm, trao đổi. 

Vì vậy, chúng ta hãy làm chính xác điều đó. Hãy để tôi đi trước và mở lên một ví dụ đó là thực sự gọi là "không có trao đổi, "bởi vì đây không phải là như chỉ đơn giản là thực hiện như bạn nghĩ. Vì vậy, trong chương trình này, nhận thấy rằng Tôi đang sử dụng stdio.h, người bạn cũ của chúng tôi. Tôi có nguyên mẫu để trao đổi trên đó, mà có nghĩa là thực hiện của nó có thể xuống dưới, và chúng ta hãy xem điều này chính chương trình sẽ làm cho tôi. Đầu tiên tôi tuyên bố int x được một, và int y được hai. Vì vậy, suy nghĩ của những người như OJ và sữa, tương ứng. Và sau đó tôi chỉ có một printf nói x là này và y là điều này, vì vậy tôi chỉ có thể trực quan xem những gì đang xảy ra. Sau đó, tôi đã tuyên bố printf mà tôi đang trao đổi hai, và sau đó tôi in ra một cho rằng họ đang trao đổi, và tôi in ra x và y một lần nữa. Vì vậy, ở đây là trong trao đổi chính xác những gì Laura đã làm, và chính xác những gì chúng ta đã thấy trên màn hình một chút thời gian trước đây. 

Vì vậy, chúng ta hãy đi trước và là vô cùng thất vọng. Làm cho không có trao đổi, và chạy không có trao đổi, phóng to ở trên đầu ra ở đây. Nhập x 1, y là 2, trao đổi trao đổi. x vẫn là 1, và y vẫn là 2. Vì vậy, mặc dù, thẳng thắn mà nói, điều này có vẻ chính xác như thế, mặc dù về mặt kỹ thuật, Laura những gì đã làm, dường như không làm việc. Vì vậy, tại sao vậy? Vâng, nó chỉ ra rằng khi chúng ta viết một chương trình như thế này mà có cả chính, nhấn mạnh ở đây, và sau đó chức năng khác, như trao đổi, nhấn mạnh ở đây, mà nó gọi, thế giới trông một chút gì đó giống như các khay một thời điểm trước đây. Khi chính đầu tiên được gọi là, đó là giống như yêu cầu hệ điều hành cho một chút bộ nhớ cho bất kỳ địa phương biến như x và y có chính, và họ kết thúc ngay tại đó. Nhưng nếu cuộc gọi chính trao đổi, và chính qua trao đổi hai tham số, a và b, nước cam và sữa, nó không giống như bàn giao các nước cam và sữa Laura. Những gì một máy tính không có gì, là nó đi bản sao của nước cam và bản sao của sữa Laura, để những gì cuối cùng bên trong khay này là một trong những giá trị và hai, hoặc OJ và sữa, nhưng bản sao, vì vậy ở thời điểm này trong câu chuyện, có là OJ và sữa trong mỗi khay. Có một và hai trong mỗi khay, và chức năng trao đổi được thực sự làm việc. Nó trao đổi chúng bên trong khay trên cùng thứ hai, trao đổi nhưng không có tác động. Và dựa trên chỉ số Nguyên tắc cơ bản chúng tôi đã nói trước đây, và thực sự chỉ là một vài phút trước, những gì có thể giải thích lý do tại sao thay đổi a và b bên trong trao đổi không ảnh hưởng đến x và y, mặc dù Tôi đi ngang qua x và y với chức năng trao đổi. Từ chính ở đây đó là những gì cách đơn giản có thể giải thích? Tôi nghĩ rằng tôi nghe nói nó ở đây? TƯỢNG: Return. SPEAKER 1: Quay trở lại? Không trở lại. Chúng ta hãy đi với một người khác. Đó là những gì? 

TƯỢNG: [không nghe được]. 

SPEAKER 1: OK, vì vậy chúng tôi có thể return-- làm cho công việc trở lại trong những câu chuyện, nhưng có một lời giải thích đơn giản hơn. TƯỢNG: Phạm vi. SPEAKER 1: Phạm vi. Tôi sẽ đưa phạm vi. Vì vậy, phạm vi, nhớ nơi x và y của chúng tôi tuyên bố. Họ tuyên bố bên trong của chính quyền ở đây. a và b, trong khi đó, là tuyên bố một cách hiệu quả bên trong trao đổi, không hoàn toàn các dấu ngoặc nhọn nhưng vẫn trong khu vực chung của trao đổi. Và như vậy thực sự, a và b chỉ tồn tại trong khay này từ Annenberg, điều này đoạn thứ hai của mã. Vì vậy, chúng tôi đang thực sự thay đổi bản sao, nhưng đó không phải là tất cả những gì thực sự hữu ích. 

Vì vậy, chúng ta hãy nhìn vào này cấp thấp hơn một chút. Tôi sẽ quay trở lại mục Source, và tôi sẽ đầu tiên phóng to ở đây, và chỉ để xác nhận rằng tôi đang ở trong này cửa sổ thiết bị đầu cuối lớn hơn, chương trình vẫn còn hành xử như vậy. Giả sử bây giờ điều này không phải là cố ý. Rõ ràng là tôi muốn trao đổi để làm việc, do đó, nó cảm thấy như một lỗi. Bây giờ tôi có thể bắt đầu thêm một rất nhiều của printf để mã của tôi, in ra ở đây x, y trên ở đây, ở đây, b trên đây. Nhưng thẳng thắn mà nói, có lẽ đó là những gì bạn đã làm cho một vài tuần bây giờ, trong giờ làm việc và ở nhà khi làm việc trên psets cố gắng để tìm thấy một số lỗi. Nhưng bạn sẽ thấy, nếu bạn chưa có, vấn đề thiết lập ba giới thiệu đến bạn để một lệnh gọi là GDB, nơi GDB, gỡ rối GNU, chính nó có một bó toàn bộ tính năng mà có thể thực sự cho chúng tôi hiểu tình huống như thế này, nhưng compellingly hơn, giải quyết vấn đề và tìm lỗi. Vì vậy, tôi sẽ làm điều này. Thay vì ./noswap, tôi thay sẽ chạy GDB ./noswap. Nói cách khác, tôi sẽ chạy của tôi chương trình không trong Bash, người bạn mới của chúng tôi ngày hôm nay. Tôi sẽ chạy của tôi chương trình noswap bên trong của chương trình này được gọi là khác GDB, mà là một chương trình gỡ rối, mà là một chương trình được thiết kế để giúp người bạn tìm và loại bỏ lỗi. Vì vậy, nếu tôi nhấn Run ở đây, có một lượng tàn bạo của văn bản mà bạn thực sự không bao giờ phải đọc. Đó là bản chất là một mất tập trung từ cửa sổ, mà Tôi sẽ nhấn Control-L để có được ở trên đó. Đây là dấu nhắc GDB. Nếu tôi muốn chạy chương trình này bây giờ, như cheat này ít tờ về ngày hôm nay trượt cho thấy, Run là lần đầu tiên lệnh mà chúng tôi có nghĩa là để giới thiệu. Và tôi chỉ cần đi gõ chạy lên đây bên trong GDB, và thực sự nó chạy chương trình của tôi. Bây giờ có một số bổ sung kết quả đầu ra của màn hình như thế này, nhưng đó là GDB chỉ là qua đường hậu môn và cho chúng tôi biết những gì đang xảy ra. Bạn không thực sự phải lo lắng về những chi tiết này ngay bây giờ. Nhưng những gì thực sự thú vị về GDB, nếu tôi làm điều này again-- Control-L xóa screen-- cho tôi đi phía trước và gõ "phá vỡ chính", do đó, khi tôi nhấn Enter, thiết lập những gì gọi là một điểm break ở noswap.c, đường 16, đó là nơi mà GDB tìm ra chương trình của tôi thực sự là, chức năng của tôi là thực sự. Điều này chúng tôi sẽ bỏ qua cho bây giờ nhưng đó là địa chỉ trong bộ nhớ đặc biệt của chức năng này. Vì vậy, bây giờ khi tôi gõ chạy, thông báo những gì mát mẻ ở đây. Chương trình của tôi phá vỡ tại đường tôi nói với GDB tạm dừng thực hiện tại. Vì vậy, tôi không phải bây giờ thay đổi mã của tôi, thêm một số của printf, biên dịch lại nó, chạy lại nó, thay đổi, bổ sung một số của printf, lưu nó, biên dịch lại nó, chạy nó. Tôi chỉ có thể đi bộ qua chương trình của tôi Từng bước từng bước với tốc độ con người, không phải ở loại Intel bên trong tốc độ. 

Vì vậy, bây giờ thấy dòng này xuất hiện ở đây, và nếu tôi quay trở lại để chương trình của tôi trong gedit, nhận thấy rằng đó là thực sự dòng đầu tiên của mã. Có 16 dòng trong gedit. Có 16 dòng trong GDB, và thậm chí mặc dù giao diện màu đen và trắng là gần như không sử dụng thân thiện, điều này có nghĩa dòng 16 đã không được thực hiện nêu ra, nhưng đó là về để được. Vì vậy, thực sự nếu tôi gõ in x, không printf, chỉ cần in x, Tôi nhận được một số giá trị không có thật có bằng không, vì x đã không được khởi tạo được nêu ra. Vì vậy, tôi sẽ đánh tiếp theo, hoặc, nếu bạn muốn được ưa thích, chỉ cho n tiếp theo. Nhưng khi tôi gõ tiếp theo nhập, bây giờ nhận thấy nó chuyển sang dòng 17. Vì vậy, một cách logic, nếu tôi đã thực hiện dòng 16 và bây giờ tôi gõ in x, những gì tôi nên xem? Một. 

Và bây giờ đây là phải thừa nhận là khó hiểu. $ 2 chỉ là một cách ưa thích của, nếu bạn muốn tham khảo giá trị mà sau này, bạn có thể nói "đồng đô la ký hai." Nó giống như một tham chiếu trở lại. Nhưng hiện nay, chỉ cần bỏ qua nó. Điều thú vị là những gì trên bên phải của dấu bằng. Và bây giờ nếu tôi gõ một lần nữa tiếp theo và in y, tôi sẽ thấy 2. Tôi còn có thể in x một lần nữa, và thẳng thắn, nếu tôi nhận được một chút nhầm lẫn như tôi đang ở đâu, tôi có thể loại danh sách cho danh sách và chỉ cần nhìn thấy một số bối cảnh xung quanh điểm tôi đang thực sự. Và bây giờ tôi có thể gõ tiếp theo, và có x là 1. Bây giờ tôi gõ tiếp theo. Oh, y là 2. Và một lần nữa, nó là khó hiểu, vì đầu ra của GDB được trộn lẫn với sản lượng của riêng tôi. Nhưng nếu bạn giữ trong tâm trí, bởi liếc qua lại mã của bạn hoặc đặt nó ra phía bên cạnh có lẽ, bạn sẽ thấy rằng thực sự tôi chỉ đẩy mạnh thông qua chương trình của tôi. 

Nhưng hãy chú ý những gì xảy ra tiếp theo, theo nghĩa đen. Đây là dòng 22. Hãy để tôi đi qua nó, do đó di chuyển vào đến 23, và nếu tôi in x bây giờ, vẫn là một. Và nếu tôi in y bây giờ, vẫn là một. Vì vậy, đây không phải là một bài tập hữu ích. Vì vậy, hãy làm lại này. Hãy để tôi quay trở lại với đầu và loại chạy một lần nữa. Và nó nói chương trình đó là đang được gỡ rối đã bắt đầu đã có, bắt đầu từ đầu. Vâng, chúng ta hãy làm điều này một lần nữa. Và lần này chúng ta hãy làm gì tiếp theo, tiếp theo, tiếp theo, tiếp theo, tiếp theo, nhưng bây giờ mọi thứ trở nên thú vị. Bây giờ tôi muốn bước vào trao đổi, vì vậy tôi không đánh tiếp theo. Tôi gõ bước, và bây giờ thấy nó đã tăng tôi để dòng noswap.c 33. Nếu tôi trở lại gedit, dòng 33 là gì? Đó là thực tế đầu tiên dòng mã bên trong trao đổi. Đó là tốt đẹp, bởi vì bây giờ tôi có thể loại poke xung quanh và nhận được tò mò như những gì đang xảy ra thực sự ở đó. Hãy để tôi in tmp. Whoa. Tại sao có một số tmp điên, giá trị rác không có thật? TƯỢNG: Nó đã không được khởi tạo. SPEAKER 1: Nó đã không được khởi tạo. Và quả thực, khi bạn chạy một chương trình, bạn đang đưa ra một bó toàn bộ bộ nhớ bởi hệ điều hành, nhưng bạn đã không được khởi tạo bất kỳ giá trị, vì vậy bất cứ bit bạn nhìn thấy ở đây, mặc dù nó tiêu cực lớn này điên số lượng, chỉ có nghĩa là mà đó là những tàn dư từ một số sử dụng trước đó của RAM, mặc dù tôi có không bản thân mình cần nó được nêu ra. Vì vậy, bây giờ tôi sẽ đi trước và loại tiếp theo, và nếu tôi bây giờ gõ in tmp, những gì tôi nên xem? Dù giá trị của một là, một là tham số đầu tiên, chỉ cần x như là người đầu tiên điều được thông qua tại, do đó, một và x nên giống nhau, tmp để in nên in cho tôi một. 

Vì vậy, những gì bạn sẽ thấy trong vấn đề thiết lập ba là một hướng dẫn của các loại trên GDB, nhưng nhận ra rằng đây là sự khởi đầu của một cái nhìn tại một công cụ mà sẽ thực sự giúp bạn giải quyết vấn đề rất nhiều hiệu quả hơn. Điều chúng tôi cuối cùng sẽ làm gì vào ngày thứ Tư được bắt đầu gọt vỏ lại một vài lớp và loại bỏ một số bánh xe đào tạo. Đó là chuỗi điều được gọi là chúng tôi đã sử dụng một thời gian, chúng ta sẽ dần dần đi mà đi từ bạn và bắt đầu nói về một cái gì đó nhiều hơn esoterically được gọi là char *, nhưng chúng ta sẽ làm tốt đẹp và nhẹ nhàng lúc đầu, mặc dù con trỏ, như chúng được gọi, có thể làm một số những điều rất xấu nếu bị lạm dụng, bằng cách nhìn vào một chút từ Claymation bạn của chúng tôi Nick Parlante Stanford Đại học, một giáo sư trong máy tính khoa học người để cùng nhau xem thử của những gì sẽ đến thứ Tư này. 

[VIDEO xem lại] Này, Binky. Thức dậy. Đó là thời gian cho con trỏ thú vị. 

Cái gì vậy? Tìm hiểu về con trỏ? Oh, hay qúa! [END IMG xem lại] SPEAKER 1: Điều đó đang chờ bạn vào ngày thứ Tư. Chúng ta sẽ thấy bạn sau đó. [VIDEO xem lại] -Và Bây giờ, sâu suy nghĩ, bởi Daven Farnham. 

-Sao Chúng ta học C? Tại sao không A +? 

[Cười] 

[END IMG xem lại]