>> DAVID J. Malan: Đây là CS50 và đây là khởi đầu của tuần thứ tư.
Và, cậu bé, là Volkswagen ở rắc rối bởi vì tất cả các phần mềm.
Chúng ta hãy lấy một cái nhìn.
[VIDEO PLAYBACK]
-Cars, Các nhân vật thông minh nhất trong các bộ phim Fast and Furious.
Tuần xuất ô tô Đức này Volkswagen thấy mình
ở giữa một vụ bê bối của tỷ lệ có khả năng phạm tội.
>> -Volkswagen Là giằng cho tỷ tiền phạt, phí phạm pháp
cho giám đốc điều hành của nó, như công ty xin lỗi
cho gian lận 11 triệu xe đến giúp nó đánh bại kiểm tra khí thải.
>> Mô hình động cơ diesel -Certain là được thiết kế với phần mềm tinh vi
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
tăng tốc độ để xác định chiếc xe trải qua thử nghiệm khí thải.
Trong bối cảnh đó, động cơ sẽ làm giảm lượng khí thải độc hại.
Nhưng chiếc xe đã được sắp đặt để bỏ qua mà khi nó đã được lái.
Lượng khí thải tăng 10-40 lần cao hơn mức EPA chấp nhận được.
>> [END PLAYBACK]
>> DAVID J. Malan: Vì vậy, chúng ta hãy hãy xem này
và xem chính xác như thế nào đây có thể được thực hiện
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.
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--
các môi trường Cơ quan bảo vệ mà
là cơ quan quản lý của Mỹ rằng xử lý các vấn đề môi trường,
và sau đó là thực tế thông báo pháp lý đó là
gửi cho Volkswagen chỉ một vài ngày trước.
>> 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
thuật toán trên một số Xe Volkswagen phát hiện
khi xe đang trải qua kiểm tra khí thải chính thức
và biến khí thải toàn kiểm soát trên chỉ trong thời gian thử nghiệm.
Hiệu quả của những ô nhiễm xe
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
tình huống.
Đ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
ga, nhưng trong quá trình hoạt động bình thường phát ra oxides-- nitơ hoặc NOx--
tại lên đến 40 lần tiêu chuẩn.
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,
theo định nghĩa của sạch Đạo luật không khí ở Mỹ.
>> Họ đi vào để nói rằng EPA và cơ quan khác
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
bởi các nhà nghiên cứu tại Tây Đại học Virginia.
Ô nhiễm NOx góp phần nitrogen dioxide, mặt đất ôzôn,
và các hạt vật chất tốt.
Tiếp xúc với những chất gây ô nhiễm có liên quan
với một loạt các ảnh hưởng sức khỏe nghiêm trọng,
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
bệnh có thể nghiêm trọng đủ cử người đến bệnh viện.
Tiếp xúc với ozone và hạt vật chất có cũng
được liên kết với non tử vong do hô hấp liên quan
tim mạch hoặc các hiệu ứng liên quan.
Trẻ em, người già, những người có bệnh hô hấp từ trước
đặc biệt có nguy cơ ảnh hưởng sức khỏe của các chất gây ô nhiễm.
>> Đủ để nói, nó khá nghiêm trọng.
Và chúng ta hãy đi vào để đọc chỉ là một đoạn trích hơn
và sau đó chúng ta sẽ có một cái nhìn tại những tác động tiềm ẩn
của điều này trong bối cảnh của một chiếc xe hơi.
Cụ thể, Volkswagen sản xuất và lắp đặt
phần mềm trong cái gọi là điều khiển điện tử
module-- hoặc ECM-- của những chiếc xe mà cảm nhận
khi chiếc xe đang được thử nghiệm cho tuân thủ các tiêu chuẩn khí thải EPA.
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
tốc độ, thời gian của động cơ của hoạt động, và áp suất khí quyển,
các yếu tố đầu vào chính xác theo dõi các thông số
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
mục đích.
>> Trong thời gian thử nghiệm khí thải của EPA, phần mềm xe ECM
chạy phần mềm đó được sản xuất kết quả phát thải phù hợp.
Tại tất cả các lần khác, phần mềm xe ECM
chạy một con đường riêng hiệu chuẩn mà giảm
hiệu quả của các hệ thống kiểm soát khí thải tổng thể,
đặc biệt là xúc tác chọn lọc giảm NOx nạc trap--
mà chúng ta sẽ thấy về trong một thời điểm.
Kết quả là, lượng khí thải NOx tăng gấp 10 đến 40 lần
trên mức phù EPA tùy thuộc vào loại chu kỳ ổ đĩa.
>> 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
trên Volkswagen có không chưa được tiết lộ công khai,
là, có hiệu quả, điều này tương đương là một nơi nào đó bên trong
mã của Volkswagen.
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
như vô lăng vị trí hoặc phong trào
hoặc thiếu đó của xe hoặc bất kỳ số lượng các yếu tố khác
hiện đang đưa ra giả thuyết là một phần của công thức này,
họ chỉ cần bật lượng khí thải toàn kiểm soát.
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.
>> Khác, trong mọi tình huống khác khi nó không được phát hiện như là
trong phòng thí nghiệm, họ chỉ cần không.
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ì đó
như thế này.
Nếu các bánh xe đang quay nhưng tay lái là không, gợi ý
rằng chiếc xe là trên một số loại xi lanh quay
nhưng trong một số loại kho đang được thử nghiệm,
sau đó hành xử như các EPA sẽ thích bạn.
Nếu không thì không.
Vì vậy, chúng ta hãy có một cái nhìn tại một video ngắn
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.
>> [VIDEO PLAYBACK]
>> -Last Friday the EPA công bố rằng một số Xe Volkswagen Audi thực hiện từ năm 2009
và năm nay đã được sử dụng một thiết bị đánh bại cái gọi là
để có được xung quanh luật khí thải được thiết kế để giữ cho không khí sạch.
Nhưng điều đó có nghĩa là chính xác?
>> Vâng, chiếc xe hiện đại có hàng chục các máy tính bên trong chúng.
Và một số các máy tính này giúp phối hợp các chức năng
của động cơ để tối ưu hiệu suất trong khi đảm bảo
mà không có quá nhiều rác sắp ra của ống xả.
Họ đã thực sự được làm việc cách này trong nhiều thập kỷ nay.
Về cơ bản, mỗi phần của động cơ một chiếc xe hiện đại
có một cảm biến hoặc điều khiển vào nó, và các máy tính
đang đọc dữ liệu trong hàng ngàn mỗi lần điều chỉnh thứ hai làm
như tỷ lệ nhiên liệu với không khí đó là đi vào các xi lanh.
>> Những Volkswagen gian lận và các mô hình Audi là động cơ diesel,
và động cơ diesel có thêm một máy tính thực sự quan trọng
các thông số kiểm soát, đó là lượng nhiên liệu cháy không hết đi
vào ống xả.
Bây giờ âm thanh xấu.
Không âm thanh như bạn muốn nhiên liệu cháy không hết đi vào ống xả.
Nhưng trong trường hợp của một diesel, bạn có một cái gì đó
đượ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ơ
đó là chất gây ô nhiễm mà có nếu không đi vào bầu khí quyển.
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.
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ó
trông giống như chiếc xe đáp ứng phát xạ tiêu chuẩn ngay cả khi nó không.
Volkswagen đã có một vấn đề về bàn tay của nó.
Động cơ diesel của nó đã được biết đến để nhận nền kinh tế nhiên liệu tuyệt vời,
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.
Vì vậy, chiếc xe sẽ phát hiện, sử dụng thiết bị thất bại này,
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,
làm các công việc bẫy NOx tốt, khí thải sẽ bị phạt.
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
nhưng bạn đang đưa nhiều như 40 lần nhiều chất ô nhiễm vào khí quyển.
Nhưng làm thế nào heck làm xe biết rằng đó là
đang được thử nghiệm cho phù thải?
EPA nói rằng đó là một tinh vi hệ thống kiểm tra điều
như vị trí tay lái, tốc độ, bao lâu động cơ đã được trên,
và thậm chí áp suất khí quyển.
Nói cách khác, đã có không có cách này là tình cờ
vì phần mềm là được thiết kế rất cẩn thận để phát hiện
một thử nghiệm khí thải chính thức.
Đó là một số khá nghiêm trọng lừa dối và đó là
tại sao Volkswagen là trong rắc rối nghiêm trọng như vậy.
Trong thực tế, Giám đốc điều hành của họ, Martin Winterkorn, vừa bước xuống.
>> Vì vậy, những gì sẽ xảy ra tiếp theo?
Vâng, nếu bạn là một trong nửa triệu Jettas diesel, Beatles, Golfs, Passats,
hay Audi A3s thực, những tin tức tốt là được
rằng xe của bạn vẫn an toàn khi lái xe.
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.
Nhưng tại một số điểm chúng có lẽ sẽ phải
để cập nhật các phần mềm bên trong xe của bạn.
Khi điều đó xảy ra có lẽ bạn có được ít dặm mỗi thùng.
Luật sư đã được chuẩn bị up cho các vụ kiện hành động lớp
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.
Nhưng đó không phải đi tới xảy ra bất cứ lúc nào sớm.
>> [END PLAYBACK]
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
như để tin tưởng.
Phải không?
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
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à
chạy phần mềm được thực hiện bởi Apple và Microsoft
và chùm của các công ty khác.
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
thực sự là những gì các công ty cho biết họ đang làm gì?
>> Ví dụ, người để nói rằng mỗi khi bạn
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ự,
đó 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
vì một số chương trình mà bạn đã bằng văn bản, cho dù đó là điều hành
hệ thống chính nó như iOS hay Android, hoặc vì bạn đã tải về
một số ứng dụng của bên thứ ba bằng cách nào đó đang lắng nghe
để 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.
Làm thế nào để bạn biết rằng, khi các bạn đang chạy Clang
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
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,
đã không được đăng nhập mỗi chuỗi bạn đã bao giờ nhận được
hoặc mỗi inch bạn đã bao giờ nhận được?
Vâng, bạn chắc chắn có thể nhìn vào mã nguồn cho một cái gì đó
như thư viện CS50, bạn có thể nhìn vào mã nguồn
cho hệ điều hành Linux chạy trên CS50 IDE.
Nhưng một bài thuyết trình tuyệt vời đã được đưa trở lại vào năm 1984
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
as-- tên là Ken Thompson người nhận được giải thưởng Turing mà
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,
cho công việc của mình trên một hệ điều hành được gọi là
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.
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
việc thiết lập những khuôn khổ cho năm và năm thảo luận
về sự tin tưởng và an ninh có này.
Đế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
của software-- là miễn phí của ngựa Trojan?
Có lẽ điều quan trọng hơn để tin tưởng những người đã viết phần mềm.
>> Và trên thực tế, chúng tôi đã liên kết để nói chuyện mà anh
đã cho khi nhận giải thưởng này trong thập niên 80 trên trang web của CS50
dưới các trang bài giảng cho ngày hôm nay.
Bởi vì những gì bạn sẽ thấy là ông thực sự mang lại cho
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ứ
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
mình đang sử dụng là một chút nếu điều kiện mà chủ yếu nói,
nếu bạn nhận thấy rằng mã này được sử dụng hàm GetString hoặc getInt
chức năng, đi trước và chèn một cánh cửa trở lại hoặc Trojan horse
như vậy mà chương trình đó hiện nay có một số số không
và những người làm một cái gì đó độc hại.
Đăng nhập tất cả các bạn tổ hợp phím, upload dữ liệu
một số máy chủ, hoặc thực sự bất cứ điều gì.
>> Và những gì Ken Thompson đi vào để làm trong bài nói chuyện của mình
là để chứng minh rằng ngay cả khi bạn có quyền truy cập vào các nguồn
mã của một trình biên dịch độc hại có thể làm điều này,
nó không quan trọng vì có gà và trứng
thực tế của nhiều qua năm, theo đó trình biên dịch
được sử dụng để biên dịch tự.
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.
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ó,
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,
họ đang sử dụng cũ phiên bản của trình biên dịch
để biên dịch mới phiên bản của trình biên dịch.
Và nếu bạn có một cái nhìn tại buổi nói chuyện đó, ông đã cho,
bạn sẽ thấy rằng vì của tuần hoàn đó,
bạn thực sự có thể có lỗi hoặc Ngựa Trojan nhúng trong phần mềm
chúng ta đang sử dụng.
Và thậm chí nếu bạn nhìn vào mã nguồn cho các chương trình,
nó thậm chí có thể không rõ ràng vì những thủ đoạn gian trá là thực sự
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
tiêm chích các mối đe dọa vào phần mềm của chúng tôi.
>> Mà chỉ là để nói, chúng tôi thực sự không thể và không nên
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.
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
và thực sự bắt đầu xây dựng các ứng dụng web mình,
chúng ta sẽ nói về những các mối đe dọa và những người khác.
Bây giờ, bạn có thể đã tự hỏi và nhận thấy rằng có một chút Darth nhỏ
Vader trong clip The Verge đã được hiển thị ở đó
về Volkswagen. Nếu bạn đã bao giờ nhìn thấy, tôi
nghĩ chúng ta nên làm sáng tâm trạng vì đây là tất cả
rất buồn và đáng sợ.
Tôi sẽ nhìn lại tại Super Bowl 2011
khi một thương mại bởi Volkswagen-- và điều này
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.
Đó là clip thứ hai 60 mà tôi nghĩ rằng bạn sẽ thích thú.
[VIDEO PLAYBACK]
[MUSIC - THEME FROM "STAR WARS"]
[DOG sủa]
[CAR BẮT ĐẦU]
[END PLAYBACK]
DAVID J. Malan: Yeah.
Tôi đã chỉ kiểm tra.
Xe đó là trên danh sách các hành vi vi phạm.
Được rồi.
Vì vậy, chúng ta xem xét một số giả một thời điểm trước đây.
Và đây là một lớn hơn đoạn mã giả
mà chúng tôi đã nhìn thấy một vài lần cho đến nay.
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
kỹ thuật mà chúng tôi đã làm thấy thuật toán
tuần trước khi chúng ta nhìn vào sắp xếp hợp nhất.
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ế,
và sau đó chúng ta sẽ sử dụng này kỹ thuật xuống đường nhất
có khả năng để giải quyết một số vấn đề khác.
>> 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ả.
Và những gì chương trình này cho phép chúng ta làm nhiên
là tìm Mike Smith trong một cuốn sách điện thoại.
Và thông báo trong dòng đặc biệt tám và 11 trong đó có tuyên bố Go To này.
Và trên thực tế, nhất định ngôn ngữ, C trong đó,
thực ra có một tuyên bố đó là nghĩa đen
đi đến đó cho phép bạn nhảy đến một dòng cụ thể.
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
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
để sử dụng các loại logic và điều khiển lưu lượng
mà chúng ta đã sử dụng cho đến nay với chỉ mạch, điều kiện và muốn.
>> 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.
Thay vì lặp đi lặp lại này hoặc looping cách tiếp cận
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,
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,
chỉ cần thay thế hai cặp dây chuyền với,
else if Smith là trước đó trong cuốn sách chúng tôi sẽ
tìm kiếm cho Mike trong nửa bên trái của cuốn sách.
Khác nếu Smith là sau này trong cuốn sách, tìm cho Mike ở bên phải
nửa cuốn sách.
Và đã nhận thấy sự tuần hoàn.
Phải không?
Tôi đang tìm kiếm Mike ở các cuốn sách điện thoại và sau đó
Cuối cùng tôi cũng có thể nhấn dòng bảy hoặc có thể dòng 10
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.
Vâng, làm thế nào để tôi tìm kiếm Mike?
Tôi đang ở giữa tìm kiếm cho Mike, tại sao
được bạn sắp xếp của tôi gửi trong một vòng tròn?
Nhưng đó là OK, vì là những gì xảy ra với các kích thước của vấn đề,
như được viết trong dòng 7 và 10?
Chúng ta không chỉ nói tìm kiếm cho Mike, tìm cho Mike.
Chúng ta đang nói cụ thể những gì?
Đ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ả
một nửa kích thước của vấn đề.
Vì vậy, nó là OK mà chúng ta đang loại tham gia vào tuần hoàn này,
lập luận thông tư này, vì ít nhất chúng tôi
làm cho vấn đề nhỏ hơn và nhỏ hơn.
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
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
did-- chúng tôi đã có một trang trái và sau đó chúng tôi không
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 đó
hoặc anh ta không phải là.
>> 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ế?
Vâng, chúng ta có thể tận dụng một kỹ thuật đó là thường được gọi là đệ quy.
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.
Nhớ lại rằng đây là giả cho sắp xếp hợp nhất.
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
chỉ về sự đơn giản mà bạn có thể thể hiện nó.
>> Nhưng đó là vì chúng tôi loại tròn
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.
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
và rồi cuối cùng chúng tôi sáp nhập trong trường hợp này.
Nhưng ở đây, quá, với hai dòng sắp xếp,
Chúng ta đã một lần nữa có này ý tưởng của đệ quy.
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,
là một thuật toán đệ quy là nếu nó sử dụng hoặc gọi chính nó.
>> Hoặc về C, một chức năng là recursive-- một chức năng gọi là
foo là đệ quy nếu foo, một nơi nào đó trong mã nguồn của nó,
gọi hàm foo chính nó.
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.
Đó 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,
nếu vấn đề này là siêu nhỏ, ví dụ,
hoặc tôi tìm thấy người mà tôi tìm kiếm, chỉ cần trả lại.
Không đệ quy, không theo chu kỳ gọi bản thân mình một lần nữa.
>> 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.
Vì vậy, tôi sẽ đi trước và mở lên hai ví dụ mã nguồn ở đây.
Một trong số đó được gọi là sigma 0.
Và đây không phải là lúc tất cả đệ quy, nhưng chúng ta hãy
một nhìn vào những gì chương trình này không.
Tôi đã bị tước bỏ tất cả ý kiến ​​của nó, nhưng tất cả
của mã nguồn trên CS50 của website có ý kiến ​​nếu bạn
muốn đọc qua đọc lại nó sau.
Và chúng ta hãy làm một vài của sự tỉnh táo kiểm tra ở đây.
>> Vì vậy, ở trên cùng của mã này, chúng tôi có bao gồm CS50.h.
Đang làm gì?
Tại sao nó lại ở đây?
Trong điều kiện của giáo lý của.
Nó làm gì?
Yeah.
>> Đung Vì vậy mà getInt chức năng hoạt động.
>> DAVID J. Malan: Vì vậy mà chức năng getInt hoạt động.
Bởi vì bên trong này file, CS50.h, mà
chúng ta sẽ thấy trước dài trong về mã nguồn của nó,
có rất nhiều chức năng declared-- getInt, GetString,
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,
các Clang trình biên dịch không phải là sẽ biết rằng nó tồn tại.
Và cùng đi cho dòng hai nơi int được định nghĩa
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.
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.
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ó.
Nhưng những gì đã làm chúng ta gọi điều này trong tuần qua?
Yeah.
Vì vậy, một nguyên mẫu.
Và tại sao chúng ta có một nguyên mẫu mà dường
có một chút dư thừa thường bởi vì chúng ta thường
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?
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ó.
Yeah.
>> Đung [Không nghe thấy] chức năng sau khi chính.
DAVID J. Malan: Chính xác.
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
mà chức năng chính sau, có lẽ.
Vì vậy Clang và nhất trình biên dịch là những loại câm
và họ sẽ chỉ biết những gì bạn nói với họ.
Và nếu bạn muốn sử dụng một chức năng gọi là sigma,
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.
>> 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,
là khá quen thuộc hy vọng bây giờ.
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
đây rõ ràng là để có được một số nguyên dương từ người sử dụng.
Và chỉ cần giữ làm phiền anh hoặc cô cho đến khi họ hợp tác.
Sau đó, trong dòng 16 Tôi có một cuộc gọi thú vị.
IntAnswer.
Mà mặt trái bên mang lại cho tôi một Int
mà có thể gọi là Answer-- store-- đó là sẽ lưu, rõ ràng,
giá trị trả về của sigma.
Vì vậy, sigma chỉ là một tên tùy ý nhưng đầy ý nghĩa
mà tôi đã trao cho một chức năng mục đích mà trong cuộc sống
là để có một argument-- chúng tôi sẽ gọi nó là N trong case-- này
và chỉ để lấy tổng của số đó cộng với mỗi số dương đó là
nhỏ hơn nó.
>> Vì vậy, nếu tôi vượt qua trong số 2 sigma, tôi muốn thêm 2 cộng 1
cộng 0-- không 0-- để mang lại cho tôi 3.
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.
Và kể từ đó trở đi.
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ó.
>> Bây giờ, xuống đây tôi chỉ cần đi để in ra các câu trả lời.
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--
và cho tôi gõ 2.
Và tôi thực sự có được 3.
Hãy để tôi gõ vào 3.
Tôi thực sự nhận được 6.
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?
>> Đung [không nghe được].
DAVID J. Malan: Vâng, không có.
Nhưng 1.275 mà là khá gần.
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
tất cả các con đường xuống 1.
Vì vậy, đó là tất cả sigma không.
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ờ.
Vì vậy, xuống đây là chức năng riêng của mình.
Và điều này dường như không có bất cứ điều gì để làm với đệ quy nào.
Trong thực tế, chúng tôi đang sử dụng một kỹ thuật trường học cũ.
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,
và tôi tuyên bố một Int gọi Tôi, đặt nó bằng với 1--
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,
người quan tâm nếu nó không hay một.
Nó sẽ không có hiệu lực.
>> 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 đó
là tham số được truyền vào.
Và sau đó tôi chỉ giữ incrementing I. Và cái nhìn sâu sắc
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ủ ý.
Tôi không muốn làm, trong này trường hợp, như tổng cộng cộng.
Tôi muốn thực sự thêm giá trị hiện tại của tôi
mà giữ nhận được lớn hơn và lớn hơn và lớn hơn để kiểm đếm chạy.
>> Và sau đó tôi trở về sum.
Và như vậy câu trả lời nhận được tổng giá trị.
Và sau đó tôi in nó ra.
Vì vậy, có một cơ hội ở đây, tuy nhiên, để loại đơn giản hóa
mã này khái niệm và các loại đòn một là
tâm trong điều khoản của đơn giản mặc dù nó
mất một thời gian để sắp xếp của đánh giá cao tại sao điều này
là mạnh mẽ trong những ví dụ nhỏ.
Dưới đây là sigma one-- nên phiên bản thứ hai của mã này.
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.
Nhưng bây giờ chúng ta hãy nhìn vào thực hiện sigma mà
Tôi đã chọn ra để chỉ những lines-- bốn dòng mã, thực sự,
cộng thêm một số dấu ngoặc nhọn và không gian màu trắng.
>> Nhưng những gì tôi làm?
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ý
rằng trường hợp siêu đơn giản.
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ạ,
Tôi chỉ cần đi để tùy tiện nhưng luôn trở về zero.
Tôi không muốn điều này để nhận được vào một số vô hạn kỳ lạ
loop vì một giá trị âm.
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.
>> 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
những gì còn lại.
Tôi cắn ra một vấn đề rất cụ thể và không một cái gì đó gọi đệ quy.
Nhưng trong dòng 31, những gì Tôi dường như đang làm?
Các dấu ngoặc đơn chỉ giữ điều, hy vọng, một chút rõ ràng hơn.
Nhưng tất cả tôi đang làm là tôi trở m-- bất cứ điều gì
bạn tay me-- cộng với giá trị của m-- xin lỗi,
cộng với giá trị của sigma của m trừ đi 1.
Vì vậy, điều này có nghĩa là gì?
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
6 vì 3 cộng với 2 cộng với 1 mang lại cho tôi 6.
Nhưng làm thế nào để tôi suy nghĩ về làm thế nào mã này được chạy?
Lần đầu tiên tôi gọi sigma và tôi vượt qua trong các giá trị 3,
mà giống như đang nói về một mảnh giấy, đây là giá trị 3
và tôi đã được thông qua này như sigma.
3 rõ ràng là không nhỏ hơn 0 nên điều kiện IF không áp dụng.
Các ELSE không.
Vì vậy, tôi phải làm gì?
Tôi muốn trở lại m, đó là 3, cộng với sigma của m trừ đi 1.
Vì vậy, hãy để tôi theo dõi này.
Tôi sẽ đặt này mảnh giấy xuống.
Và những gì giá trị, để được rõ ràng, tôi sẽ vượt qua
vào sigma vào thời điểm này trong câu chuyện?
Số gì?
2, phải không?
3 trừ đi 1 là 2.
Vì vậy, tôi chỉ cần một chút phế liệu giấy ở đây.
Vì vậy bây giờ sigma là nhận được gọi một lần nữa.
Và tôi đã cố tình đặt xuống này bởi vì nó
loại giống như tạm dừng là phiên bản của câu chuyện
vì bây giờ tôi đang tập trung trên tín hiệu của m trừ đi 1.
Vì vậy, m là 3, m trừ đi 1 là 2.
Vì vậy, đây là 2 mà tôi đã được thông qua.
2 rõ ràng là không ít hơn 0 để trường hợp đó không áp dụng.
Else tôi trở về m, mà là này điều, cộng với sigma của những gì giá trị?
Vì vậy, nếu sigma của 1-- vì m là ngay bây giờ 2 để 2 trừ 1 là 1.
Vì vậy, bây giờ tôi chỉ có giá trị 1.
Tôi đang đi qua chỉ số 1 cho chức năng sigma--
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.
>> Trở lại khác 1 cộng sigma của những gì?
0.
Vì vậy, hãy để tôi chỉ cần nhớ rằng.
Tôi sẽ lấy lại cho rằng sau này.
Bây giờ tôi sẽ đi trước và jot xuống số 0 bởi vì đó là
đối số hoặc tham số của tôi.
Tôi đã thông qua các số 0 và cuối cùng là quá trình này
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ì
Tôi ngay lập tức làm một lần tôi thấy 0 này?
Tôi trở về zero.
Vì vậy, bây giờ bạn phải tua lại câu chuyện.
>> 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
Tôi đã làm nếu bạn là nghĩa đen tua một video?
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.
Nếu tôi tiếp tục tua sự câu chuyện, đó là sẽ cho tôi
2 cộng với giá trị chạy này, đó là 1.
Vì vậy, đó là 3.
Và sau đó tôi sẽ giữ tua.
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.
>> Và bây giờ, nếu bạn đã rewound video cho đến thời điểm này,
này là rất Câu hỏi đầu tiên tôi hỏi.
Khi thông qua 3, sigma 3 là gì?
Nó thực sự 6, tổng của tất cả các mảnh giấy.
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.
Nhưng xem xét đó là một little-- nó đã rất cố ý mà tôi xếp chồng lên nhau
những con số trên đầu trang của mỗi khác.
Đó là loại giống như có một memory-- một kỷ lục trong thời gian,
như một chà sàn trong một video, mà tôi thực sự có thể tua lại trong.
Và chúng ta sẽ quay trở lại rằng ẩn dụ trong chỉ một chút.
>> 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,
Tôi đoán, tại Google.
Sẽ một người rất giỏi Googling tâm
sắp lên một lát và giúp tôi tìm kiếm một cái gì đó?
Rất, trọng rất thấp.
Một người không bao giờ đi lên trước, có lẽ.
ĐƯỢC.
Yeah?
Thôi nào.
Come on xuống.
Tên bạn là gì?
>> SAM: Sam.
>> DAVID J. Malan: Sam, đến trên xuống.
Điều này là tương tự.
Rất hân hạnh được biết bạn.
Chào.
Đến ngày qua.
Vì vậy, tất cả tôi cần bạn làm, nếu bạn có thể, Sam, đây là Google.
Bạn có thể tìm kiếm đệ quy hạn?
Đừng làm hỏng.
>> Và bây giờ let's-- yeah.
Nhấn OK mà.
Better bấm vào đó.
Ahh, có được nó.
Không có?
ĐƯỢC.
Vì vậy, chúng ta hãy làm một vài người khác.
Không quá nhiều liên quan học tập ở đây, nhưng có bạn
từng tìm kiếm Google cho phép đảo chữ?
>> SAM: No.
>> DAVID J. Malan: OK.
Tìm kiếm đảo chữ thay vì đệ quy.
Làm thế nào về lệch.
Bạn bao giờ tìm kiếm lệch?
Bây giờ, con này hơi khó nhìn thấy, nhưng hy vọng everything's-- OK.
Nó chỉ là bạn và tôi thưởng thức này.
ĐƯỢC.
>> Vì vậy, cuối cùng, one's-- này đó là một chút lệch.
Bây giờ làm một cuộn thùng.
Quá tuyệt vời.
Được rồi.
Big Sam cảm ơn bạn.
Ở đây bạn đi.
Cảm ơn.
>> Vì vậy, những gì đang xảy ra ở tất cả các Những ví dụ ngớ ngẩn?
Vì vậy, thực sự, bên dưới mui xe của Hàng triệu dòng mã của Google
rõ ràng là một vài ngớ ngẩn IF điều kiện vật chất cơ bản
kiểm tra xem người dùng có gõ vào cụm từ này,
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
để thực hiện chỉ để được vui theo cách này.
Nhưng đó là tất cả nó nắm xuống dưới mui xe.
Nhưng, tất nhiên, đệ quy là chi tiết của các geekier
Ví dụ trong số những thủ thuật đặc biệt.
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
phát hiện ra chỉ được nêu ra.
>> Vì vậy, hãy xem, hoặc xem xét bây giờ các chương trình sau đây,
và chắc chắn lấy bất kỳ trong số này trên đường hết.
Tôi sẽ đi trước và mở ra một chương trình đó là
sẽ cố gắng để trao đổi hai giá trị.
Nhưng trước khi chúng ta đi đến đó, chúng ta hãy làm điều này.
Chúng ta có thể nhận được thêm một tình nguyện viên, tôi nghĩ?
Bạn có muốn làm tình nguyện?
Không có?
Nào lên.
Được rồi.
Vì vậy, tên của bạn là gì?
>> Lauren: Lauren.
>> DAVID J. Malan: Lauren.
Nào lên, Lauren.
Vì vậy, Lauren đang được thách thức ở đây như sau.
Rất hân hạnh được biết bạn.
Vì vậy, ở đây có Lauren trước của hai cốc rỗng của cô.
Và chúng tôi có một số cam nước trái cây và một ít sữa
và chúng ta sẽ đi trước và làm như sau.
Chúng tôi chỉ cần đi để điền này.
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.
>> Và phía trước của tất cả các các khán giả,
trao đổi hai giá trị của những ly.
Đặt nước cam vào cốc sữa và sữa trong cốc nước cam.
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?
Lauren: Đặt nó trong cốc khác.
DAVID J. Malan: OK.
Vì vậy, chúng ta hãy có một tạm thời biến, nếu chúng tôi sẽ.
Và đi trước bây giờ và thực hiện thủ tục trao đổi cùng này.
Vì vậy, tốt.
Chúng tôi đã đặt OJ vào tạm thời biến, sữa vào biến OJ,
và bây giờ các biến tạm thời vào biến sữa.
ĐƯỢC.
Vì vậy, thực hiện rất tốt cho đến nay.
Vì vậy, nó quay out-- giữ mà suy nghĩ một lát.
Ở đây, để chỉ geek nó lên một chút, điều này sẽ là mã C tương ứng
mà chúng ta vừa thực hiện.
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à
int của.
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,
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,
vào đó đổ một trong những giá trị để chúng tôi có một giữ chỗ cho nó.
Nhưng sau đó mã là chính xác như Lauren ở đây thực hiện.
>> Bây giờ, chỉ để có được một chút điên, hóa ra
mà bạn có thể làm điều này mà không cần một biến tạm thời.
Để 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.
Chúng tôi có một số chén thêm ở đây.
Vì vậy, những điều gần gũi nhất mà trông như sữa và nước perhaps--
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
với một vài ounces nước trong.
Đó có thể là quá nhiều.
Yeah.
Đó chắc chắn là quá nhiều.
Giữ trên một giây.
>> 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,
hy vọng nó không kết hợp với nước.
Nhưng nó loại loại trông giống như sữa và OJ.
Vì vậy, bây giờ, mà không sử dụng một biến tạm thời,
bạn có thể trao đổi những hai giá trị?
Vì vậy, dầu đi vào cốc nước, nước đi vào cốc dầu.
Lauren: Không ly khác?
DAVID J. Malan: Không ly khác.
Và tôi đã không thực sự được thử nghiệm này trước khi năm nay
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.
Đó không phải là mong muốn xảy ra.
Nó có đang làm việc không?
Được rồi.
Vì vậy, tách?
Tốt.
Bây giờ chúng tôi có để có được nước vào cốc khác.
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.
>> Lauren: Nước là ở phía dưới.
>> 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.
Bạn phải làm điều đó theo thứ tự đúng.
Yeah.
Vậy là được rồi.
Vì vậy, bây giờ chúng tôi có hai tách dầu.
ĐƯỢC.
Vậy là được rồi.
Nhưng về mặt hóa học nếu điều này đã làm việc hơn I--
>> Lauren: Đây là nước.
>> DAVID J. Malan: Đó là chủ yếu là nước.
Được rồi.
Nhưng đó vẫn là cốc như trước.
Vì vậy, đổ it-- thử nó ở đó.
ĐƯỢC.
Đây là một sử dụng tốt thời gian học ngày hôm nay.
ĐƯỢC.
Vì vậy bây giờ we-- đẹp.
Phân loại của.
Được rồi.
Vì vậy, rất tốt.
Cảm ơn bạn Lauren.
Thực hiện rất tốt.
>> 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ẽ
để 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
mà không sử dụng một số nguyên tạm thời.
Và đây là mã C tương ứng.
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,
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
biểu tượng là, hình tam giác nhỏ biểu tượng từ bàn phím đại diện?
Điều hành Bitwise gì?
>> Đung Exor.
>> DAVID J. Malan: Exor.
Exclusive Or.
Vì vậy, nếu bạn muốn, chỉ để cho vui tại nhà, để cho a và b hai tùy ý
giá trị như thế nào và tôi eight-- sẽ chọn một giá trị tám bit.
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.
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,
và cung cấp cho b một giá trị tương tự.
Và sau đó sử dụng định nghĩa của XOR từ thứ Tư tuần trước,
áp dụng bit của bit, mỗi tám bit trong mỗi của a và b,
và sau đó làm điều đó một cách chính xác cho mỗi mã này.
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.
Nó thực sự nắm để ba hoạt động XOR
và bằng cách nào đó kỳ diệu và một b sẽ đổi vị trí
mà không mất bất kỳ thông tin.
>> Vì vậy, các trick dầu và nước là gần nhất thân thế giới thực
Tôi có thể nghĩ ra để bắt chước mà.
Nhưng nó chắc chắn dễ dàng hơn để sử dụng một biến tạm thời,
như trong trường hợp này ở đây.
Và điều này cũng là một cơ hội nói, quá, loại vi tối ưu hóa,
như một nhà khoa học máy tính có thể nói, trong khi loại thú vị
để 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,
nó không phải là tất cả những gì hấp dẫn.
Bởi vì để tiết kiệm 32 bit, như trong trường hợp của một int thực tế,
không phải là tất cả những gì hấp dẫn trên một hệ thống nơi
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.
Và trên thực tế, khi chúng tôi nhận được cho một vấn đề thiết lập sau
và bạn thực hiện chính tả kiểm tra và bạn sẽ
được thử thách để làm như vậy với RAM ít và ít
thời gian nhất có thể trên computer-- bạn vẫn
có một tuần để thực hiện it-- bạn sẽ have-- bạn sẽ có
thách thức để giảm thiểu những tài nguyên.
Và đó thực sự là chỉ Nhân dịp này học kỳ
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
chi phí khác.
>> Vì vậy, làm sao chúng ta what-- thấy điều này trong mã thực tế?
Hãy để tôi đi trước giờ và mở ra một ví dụ
mà cố tình được gọi là Không Swap vì nó không
trong thực tế, trao đổi các biến như bạn thực sự có thể mong đợi.
Vì vậy, chúng ta hãy có một cái nhìn.
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.
Bây giờ chúng tôi có một nguyên mẫu cho swap lên hàng đầu mà chỉ
có nghĩa là nó phải được định nghĩa sau.
Và đây là chính.
>> Tôi tự ý gán x và y, tương ứng, các giá trị một và hai
chỉ bởi vì họ đang nhỏ và dễ dàng để nghĩ về.
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
và y là 2 có lẽ là những gì những người printfs sẽ nói.
Vì vậy, không có phép thuật vậy, đến nay.
>> Sau đó, tôi sẽ yêu cầu bồi thường với in def, trao đổi dot dot dot.
Tôi sẽ gọi hoán đổi chức năng, đi qua trong x và y.
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
vì nó là một khoảnh khắc trước với một biến tạm thời.
Và vì vậy tôi mạnh dạn tuyên bố, đổi chỗ.
x bây giờ điều này và y là bây giờ mà.
Nhưng những tập tin, tất nhiên, được gọi là No Swap.
Vì vậy, hãy thực sự nhìn thấy những gì xảy ra.
Nếu tôi biên dịch không có trao đổi và sau đó làm ./noswap, x là 1, y là 2.
Trao đổi đổi chỗ.
x là 1, y là 2.
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--
đượ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.
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ờ.
Điều này, quá, nên chỉ làm việc giống như với sữa và OJ,
nhưng nó dường như không được làm việc.
>> Vì vậy, hãy làm điều này một lần nữa.
Có lẽ tôi chỉ là không chạy đúng.
Vì vậy, chúng ta hãy chạy No Swap lại.
Có lẽ I-- không.
Vì vậy, nó không chỉ làm việc.
Vì vậy, chúng ta hãy làm một kiểm tra sự tỉnh táo chút.
Hãy để tôi đi trước đây trong Swap và chỉ cần thêm, chờ một phút,
một là% i / n và chúng ta hãy plug-in các giá trị của a.
Bởi vì tôi thực sự muốn để xem những gì đang xảy ra.
Và quả thực, đây là một kỹ thuật gỡ lỗi
mà bạn có thể được sử dụng trong giờ văn phòng hay ở nhà đã có,
giống như nửa đầu của Dan Video Armendáriz trong PSET3
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
đối với trường hợp đơn giản.
Hãy để tôi đi trước và chạy make trao đổi không có một lần nữa, ./noswap.
>> Thú vị.
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.
Vì vậy, hai bằng cách nào đó đã đổi chỗ nhưng x và y không nhận đổi chỗ.
Vì vậy, để được rõ ràng, những gì đang xảy ra được, ở đây tôi có x và y
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
Trao đổi.
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ó
hoặc các thông số của nó bất cứ điều gì nó muốn.
Foo hoặc thanh hoặc x hoặc y hoặc a hoặc b.
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,
Tôi đã nói a và b.
Nhưng chúng ta có thể gọi cho họ bất cứ điều gì chúng ta muốn.
>> Và do đó, nó trông giống như trao đổi được thông qua
x-- AKA a-- và nó được thông qua y-- AKA b.
Bằng cách nào đó những ba dòng là trao đổi những giá trị chính xác
như Lauren đã làm với sữa và OJ.
Nhưng khi chúng tôi in ra các giá trị a và b
có thực sự trao đổi nhưng x và y không có sự thay đổi với họ.
Nhớ lại rằng x và y là lên đây.
>> Vì vậy, chúng ta có thể thấy điều này qua kỹ thuật khác là tốt.
Và điều này cũng là một kỹ thuật nhúng trong vấn đề thiết lập ba.
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ó.
Về phía chúng tôi tay phải có tab Debugger này.
Và nếu bạn mở này lên, có một số thông tin phức tạp
đó là ném vào bạn ban đầu.
Nhưng chúng ta hãy trêu chọc này ngoài thật nhanh.
>> Vì vậy, một trong, bạn sẽ thấy các biến địa phương.
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
nói chung, là một trình gỡ lỗi.
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
mà không cần phải dùng đến thêm printfs và biên dịch và chạy
và thêm printf và biên dịch và chạy, mà đã có, trong giờ hành chính
hoặc nhà, có lẽ nhận được khá tẻ nhạt.
>> 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
các giá trị của các biến địa phương của chúng tôi.
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à
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ã
mà tôi tò mò về.
Phải không?
Các chương trình này chạy trong một phần giây.
Đó 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
những gì đang xảy ra xung quanh một dòng nhất định mã
mà không cày chương trình qua nó và kết thúc hoàn toàn.
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.
>> 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à
được gọi vào lúc này.
Chính luôn được gọi đầu tiên.
Nhưng nếu chính gọi một chức năng gọi là Swap,
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
gọi theo thứ tự thời gian đảo ngược.
Vì vậy, chúng ta hãy xem đó.
>> Tôi sẽ để thu nhỏ.
Tôi sẽ quay trở lại mã của tôi.
Và chỉ vì tôi muốn là mô phạm ở đây,
Tôi sẽ đi trước và bấm ngay bên trái của dòng năm.
Và tạo ra một dấu chấm màu đỏ.
Và hãy chú ý về phía bên tay phải rằng debugger biết, hey,
Tôi chỉ nói một breakpoint ở dòng noswap.c năm, đặc biệt
tại dòng mã này.
Vì vậy, các debugger biết rằng Tôi đã yêu cầu trong thời gian tới
Tôi chạy chương trình đó tôi tạm dừng thực hiện có thay vì chỉ
chạy toàn bộ điều siêu nhanh.
>> Vì vậy, bây giờ tôi sẽ để nhấn Debug nút ở đầu rất của IDE
và đó là sẽ làm như sau.
Nó sẽ mở một đầu hơi đáng sợ tìm terminal thứ hai window--
gỡ lỗi từ xa tổ chức như vậy và such--
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.
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,
debugger có cố tình dừng execution--
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 đó.
Và đó là lý do tại sao dòng bảy là nay đánh dấu màu vàng.
>> Và bây giờ chúng ta hãy có một cái nhìn ở phía bên tay phải.
Dường như, theo mặc định, độc đáo đủ, x có giá trị gì?
0.
Và y có giá trị gì?
Zero.
Và đó là để được mong đợi trong ý nghĩa rằng x và y-- rằng line-- vàng có
không thực hiện được nêu ra.
Vì vậy, không nên x có giá trị 1.
Nó có thể có giá trị khác, một giá trị được gọi là rác.
Và chúng tôi đã may mắn ở chỗ nó bằng không ở thời điểm này, về cơ bản.
>> 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
khi gỡ lỗi trong cách này.
Chú ý ở đây, chúng ta có một nút Play.
Và nếu chúng tôi chơi hoặc nhấn tiếp tục, đó chỉ là
sẽ chạy qua phần còn lại của chương trình
hoặc cho đến khi nó chạm breakpoint khác.
Nhưng tôi đã không đặt bất kỳ khác breakpoint vì vậy nó chỉ
sẽ chạy qua kết thúc.
Đó là loại đánh bại Mục đích của chĩa ra xung quanh.
>> Vì vậy, thay vào đó, tôi quan tâm các biểu tượng bên phải.
Và nếu tôi đưa chuột qua họ, như bạn cũng nên như vậy,
bạn sẽ thấy chút mẹo công cụ tips--.
Đây là một bước qua.
Bây giờ điều đó không có nghĩa là bỏ qua các dòng mã sau đây.
Đ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,
di chuyển đến tiếp theo.
Nói cách khác, thông qua nút đó, tôi có thể đi bộ
qua tôi mã một bước tại một thời điểm.
Từng dòng, theo nghĩa đen.
Bây giờ, bên phải rằng, có một khác
rằng chúng ta sẽ thấy chỉ trong một khoảnh khắc.
Đây là cái gọi là Bước vào biểu tượng đó
sẽ cho phép tôi bổ nhào vào chức năng khác.
Nhưng hãy xem này chỉ trong một khoảnh khắc.
Vì vậy, tôi sẽ bấm bước qua.
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,
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.
x bây giờ là 1 vì dòng màu vàng hiện nay đã thực hiện
và chúng tôi đã chuyển sang dòng 8.
Và chỉ trong một khoảnh khắc y hy vọng sẽ trở thành 2.
>> Bây giờ, không có gì thú vị xảy ra cho một chút.
Tất cả điều này là là printf.
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.
Và bây giờ tôi phải làm một quyết định như các lập trình viên.
Tôi có thể bước qua dòng này của mã, thực hiện nó nhưng không
nhận được tò mò về những gì bên trong.
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ó.
Vì vậy, chúng ta hãy làm sau này.
>> Hãy để tôi đi trước và bấm không Step Over nhưng Step Into.
Thông báo, tất cả của một đột ngột những thay đổi cửa sổ
để làm nổi bật đầu tiên dòng mã trong Swap.
Đó là dòng 21.
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,
một dấu phẩy b là 1 và 2 tương ứng.
Tại sao nhiệt độ 32.767?
Nhắc lại temp mà, giống như cốc rỗng một thời điểm trước đây,
được khai báo ở đây trên dòng 21.
Tại sao 32,000- tôi là, tại sao nó chỉ là một số giá trị kỳ lạ?
Yeah?
>> Đung Nó không được khởi tạo.
>> DAVID J. Malan: Đó là không được khởi tạo.
Vì vậy, máy tính của chúng tôi luôn luôn có bộ nhớ vật lý.
Nó luôn luôn có RAM vật lý.
Và luôn luôn có số không của và một ở trong đó, phải không?
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,
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.
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.
Không có vấn đề hay không bạn đang sử dụng chúng.
Bạn có thể không chỉ có trống không gian nơi bạn muốn bit.
Họ đang hoặc là số không và những người thân.
>> Vì vậy, nó quay ra temp mà, vì chúng tôi đã không được khởi tạo được chưa,
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.
Vì vậy, bất cứ điều gì họ nhất sử dụng gần đây for-- những 32 bits--
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
bit.
Ngay sau khi tôi bấm Step Over mặc dù, phew, temp là đi để có được giá trị 1.
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
và sau đó b là sẽ được gán giá trị là 1.
>> 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
là debugger là hiển thị cho tôi, siêu chậm
theo tốc độ của riêng tôi, những gì bang Swap là.
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
có hai lớp với nó.
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 đó,
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
xung quanh và đi vào bất kỳ phạm vi khác nhau.
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,
nếu tôi đi lại giữa Swap nơi một là 2 và b là 1 và chính,
đã chính bị ảnh hưởng ở tất cả?
Không.
Vì vậy, các takeaway ở đây là gì?
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,
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
trong trường hợp này là một bản sao những đối số.
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
là hai địa phương mới biến, hay tranh luận,
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
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
nhưng họ không phải là giống như là x và y.
>> Nó như thể chính có trên mảnh của nó giấy số 1 và 2 cho x và y,
và sau đó khi nó tay mà mảnh giấy để Trao đổi,
Trao đổi rất nhanh chóng giúp bút riêng của mình, viết xuống
1 và 2 trên bảng riêng của mình giấy, tay sao các xy gốc để chính
và sau đó làm của riêng mình điều với a và b.
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
cho việc viết mã đúng bởi vì nó sẽ có vẻ chúng ta không thể trao đổi
hai biến.
>> Tôi đã viết một hàm Swap đúng.
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ế,
nhưng dường như không ai trong số đó vấn đề nếu bạn có thể không thực sự
trao đổi hai giá trị vĩnh viễn.
Vì vậy, chúng ta cần một cách khác để thực sự có được lúc này,
và chúng ta cần để có thể thực sự giải quyết vấn đề này.
Và nó quay out-- và chúng tôi sẽ đến trở lại hình ảnh đặc biệt này
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.
Nó chỉ là một hình chữ nhật.
Bạn có thể vẽ nó bất kỳ số cách nhưng nó
thuận tiện để vẽ nó như là một hình chữ nhật với lý do sau đây.
>> 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.
Và ngăn xếp chỉ là một đoạn của RAM-- một đoạn memory--
có chức năng có thể truy cập đến khi chúng được gọi.
Và do đó, nó chỉ ra rằng tại dưới cùng của ngăn xếp này
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ứ
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,
tốt, Swap là sẽ có được một lớp của bộ nhớ lên trên nó.
>> 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--
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ó,
nếu chúng ta chỉ quan tâm đến đáy của hình ảnh này cho bây giờ,
là khi tôi chạy một chương trình và chính được gọi là,
Chính được đưa ra một đoạn RAM trong máy tính của tôi mà là
ở dưới cùng của cái gọi là stack.
Và tôi sẽ rút ra nó cố tình như một hình vuông.
Vì vậy, nó giống như 32 bit hay bốn byte.
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
và nó có một biến gọi là y với giá trị 2, đó là
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
hệ thống và chia nó lên để các biến địa phương đầu tiên tại đây,
điều thứ hai tại đây, và đó là nó.
>> Khi chính gọi Swap, Swap được lát riêng của bộ nhớ
rằng chúng ta sẽ vẽ như thế này từ hệ điều hành,
và nó sẽ có của nó biến cục bộ của riêng dựa
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
và b mà ban đầu được các giá trị 1 và 2.
Nhưng sau đó, ngay sau khi mã Swap thực hiện,
và Lauren thực sự hoán đổi OJ và sữa, những gì đang xảy ra?
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,
có một biến temp đó là được sử dụng mà toàn bộ thời gian mà cuối cùng
Đi đi.
Nhưng nó không quan trọng bao nhiêu công việc bạn làm
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.
>> 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ó
truy cập bí mật, nếu bạn muốn, để chức năng like-- để nhớ như x và y.
Vì vậy, chúng ta hãy nhìn vào một ví dụ giúp
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.
Tôi sẽ đi trước và mở ra so sánh Zero.
Và tôi sẽ phải đóng cửa gỡ rối của chúng tôi, tôi sẽ
để đóng thông báo tìm kiếm đáng sợ này chỉ nói, chờ một phút,
bạn đang ở trong các trung gỡ lỗi.
Tôi sẽ để ẩn tab này ở đây chỉ để trở lại đơn giản.
Vì vậy, đừng lo lắng nếu GDB sẽ bị chết.
Đ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,
bởi tôi.
>> Và bây giờ so sánh Zero, thực hiện điều này.
Tôi đang sử dụng CS50 thư viện trong tiêu chuẩn I / O.
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.
Sau đó nói nó một lần nữa và được một chuỗi khác.
Và nhận thấy rằng hai chuỗi các được gọi là s và t, tương ứng.
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,
nó phải cho tôi biết, Tôi đã gõ những điều tương tự?
Và vì vậy tôi sẽ trở lại với một tuần.
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.
Không phải là điều hành phân công, điều hành bình đẳng.
Tôi chỉ so sánh s và t.
>> Vì vậy, hãy thực sự đi trước và làm điều này.
Và tôi sẽ đi trước và làm cho So sánh Zero.
Tôi sẽ làm ./comparezero.
Và tôi sẽ đi trước và nói điều gì đó
như thế, chúng ta hãy làm mẹ trong chữ thường và làm thế nào về mẹ chữ hoa.
Và dĩ nhiên tôi gõ những thứ khác nhau.
Được rồi.
Đó là để được mong đợi.
>> Hãy chạy lại nó.
Cả hai lần làm chữ thường, chữ thường.
Điều đó có vẻ siêu giống với tôi.
Nhập.
ĐƯỢC.
Có lẽ nó chỉ lạ bởi vì nó không thích ngữ pháp của tôi.
Vì vậy, chúng ta hãy làm một MOM vốn, vốn MOM, giống hệt nhau.
Những thứ khác.
>> Vì vậy, tại sao vậy?
Vâng, những gì đang thực sự xảy ra trên dưới mui xe ở đây?
Vì vậy, chúng ta hãy nhìn lại ở đây chỉ một khoảnh khắc
và xem xét những gì GetString là thực sự làm.
Khi bạn gọi GetString, đó là một hàm chúng ta
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.
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
một đoạn bộ nhớ trông như thế này.
Và nếu tôi gõ trong tất cả chữ thường m-o-m-- và những gì diễn ra sau đó?
Chỉ cần kiểm tra sự tỉnh táo nhanh chóng.
>> Không gạch chéo ngược.
Chúng ta biết rằng.
Và nhớ lại rằng chúng tôi đã chơi xung quanh với tên Zamila của
và một loạt các tên tuổi khác khi Rob đã ở đây tìm kiếm
vào những gì đang xảy ra bên trong bộ nhớ.
Vì vậy, câu chuyện đó là chính xác như nhau.
Đây là những gì GetString đang trở lại với tôi.
Bây giờ, mã số của tôi lúc nãy lưu trữ giá trị trả về của GetString
trong một biến gọi là s.
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.
>> Vì vậy, nếu tôi đi qua đây, tôi cần để vẽ variable-- địa phương này
và tôi thường đi vẽ một chuỗi như just-- chúng tôi sẽ
gọi nó s-- như một hình vuông nhỏ ở đây.
Và bây giờ, somehow-- thế nào mẹ đi vào bên trong của biến s này?
Vâng, chúng ta cần phải trở lại nguyên tắc đầu tiên ở đây.
Điều gì đang thực sự GetString trở về?
>> 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ố
của chuỗi khác trong bộ nhớ như Zamila và Rob hay Andy hoặc bất kỳ người khác,
tất nhiên là trong chúng tôi RAM hoặc bộ nhớ của máy tính.
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,
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.
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ố
chúng, nhưng chúng ta có thể đánh số mỗi của những tỷ hoặc hai tỷ
hoặc bốn tỷ byte.
>> 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,
thứ ba, thứ tư.
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 đó.
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,
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
sau đó ba hơn bốn.
Và nếu tôi cứ vẽ, hộp số hai tỷ sẽ là cách trên đây.
>> Vậy điều gì làm bạn nghĩ rằng, sau đó, GetString thực sự trả về?
Nó không phải trả lại M-O-M backslash zero cho mỗi gia nhập, vì đó rõ ràng
sẽ không phù hợp trong hộp mà tôi đã vẽ.
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?
Câu trả lời là trên hội đồng quản trị ở đâu đây thôi.
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ế?
Nếu bạn đã có được siêu thông minh, đặt về cái gọi là hat kỹ thuật,
những gì bạn có thể trở lại?
Số tiền ít nhất của thông tin là gì bạn có thể trở về mà sẽ vẫn
cho phép bạn tìm M-O-M trong bộ nhớ?
Yeah?
>> Đung One.
>> DAVID J. Malan: One.
Và tại sao người ta?
Đung Bởi vì nó sẽ cho bạn phải đi đâu [không nghe được].
DAVID J. Malan: Chính xác.
Tôi chỉ cần đi để trở về địa chỉ của chuỗi mà tôi đã nhận được.
Các địa chỉ trong này trường hợp là địa điểm duy nhất.
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--
vừa được các địa chỉ của chuỗi đó.
>> Trong khi đó, nếu tôi gọi GetString một lần thứ hai và tôi
gõ vào nghĩa đen thing-- cùng M-O-M với lowercase-- M-O-M
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
đượ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,
này là 13.
Các máy tính sử dụng một số khác bộ nhớ vì lý do gì.
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?
10.
Chính xác.
>> Và như vậy khi chúng ta nhìn vào mã nguồn của chương trình này
nơi mà tôi chỉ cần cố gắng để so sánh hai giá trị,
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?
Chỉ cần không có vì 1 không bằng 10.
Và vì vậy đây nằm một cơ hội cho chúng ta thực sự
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,
những gì đang xảy ra bên dưới mui xe?
Chúng tôi đã nói về bit và byte và bộ nhớ,
nhưng nó thực sự hữu ích để hiểu bởi vì khi bạn gọi GetString,
mặc dù chúng ta nghĩ về nó là trở về M-O-M hoặc chuỗi mẹ
hoặc Andy hoặc Zamila hay như thế, về mặt kỹ thuật
nó chỉ trở về địa chỉ trong đó đoạn bộ nhớ.
>> Nhưng đó là OK.
Bởi vì làm sao tôi biết nơi kết thúc chuỗi?
Nếu tôi chỉ đưa ra sự bắt đầu?
Vâng, dấu chéo ngược bằng không, phải không?
Chỉ trong thời gian tuyến tính tôi có thể in ra với bản in def M-O-M.
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,
Tôi đã biết ngầm nơi tôi cần phải chấm dứt.
>> 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
đã đi qua rất nhiều khó khăn để có được những huấn luyện ở đây wheels--
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--
>> [Vỗ tay]
>> Điều đó cũng có giá trị chuyến đi Target sáng nay, có?
Vì vậy now-- có, nó quay ra, có những điều như chuỗi.
Chuỗi không tồn tại.
Đó là một từ đồng nghĩa rằng chúng ta đã có bên trong của thư viện CS50.
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.
Và ngôi sao char chúng tôi sẽ trêu chọc nhau trước khi dài.
Nhưng điều này là để nói, rằng ngay cả nếu chúng ta tiếp tục
sử dụng GetString cho bây giờ, về mặt kỹ thuật nên tôi
được nói sao char và char sao.
>> Và hóa ra những gì ngôi sao sẽ biểu thị một cái gì đó
được gọi là một con trỏ hoặc một địa chỉ.
Và trên thực tế, một lời trêu ghẹo cho những gì nằm phía trước
là 20 đoạn thứ hai này từ chúng tôi người bạn Nick Parlante tại Stanford
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,
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,
làm claymation giới thiệu với thế giới
một nhân vật tên Binky với người mà chúng tôi sẽ
được giới thiệu thời gian tới để con trỏ.
Vì vậy, đây là một bản xem trước của những gì sẽ đến.
>> [VIDEO PLAYBACK]
>> -Hey, Binky.
Thức dậy.
Đó là thời gian cho con trỏ của niềm vui.
>> -Cái gì thế?
Tìm hiểu về con trỏ?
Oh, hay qúa.
>> [END PLAYBACK]
DAVID J. Malan: Và lưu ý rằng, chúng ta sẽ thấy bạn vào ngày thứ Tư.
Được rồi.
Ai nhảy múa là?
Thôi nào.
Ai nhảy múa là?
Bạn muốn tôi để có được nó bắt đầu?
Tôi sẽ nhận được nó bắt đầu.
Woooo!
>> Lauren: Sweet Moses ưa thích.