Дэвид Дж Малан: Это CS50 и это начало недели четыре. И, мальчик, Volkswagen в Беда все из-за программного обеспечения. Давайте взглянем. [ПРОИГРЫВАНИЕ ВИДЕО] -автомобили, Самые умные персонажи в Форсаж фильмов. На этой неделе немецкий автопроизводитель Volkswagen оказался в середине скандала потенциально криминальные масштабы. -Volkswagen Готовится миллиарды штрафов, возможные уголовные обвинения для ее руководителей, а Компания приносит свои извинения за фальсификацию 11 миллионов автомобилей в помочь ему победить тесты выбросов. -Certain Дизельные модели были разработан с сложное программное обеспечение что б информация в том числе положение руля и автомобиль ускорить, чтобы определить, что автомобиль был проходит тестирование выбросов. Под этим обстоятельством, двигатель позволит снизить выбросы токсичных веществ. Но машина была оснащена обойти что, когда он был гонят. Выбросы увеличились от 10 до 40 раз выше допустимых уровней EPA. [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: Так давайте Взгляни на это и посмотреть, как именно это может быть реализована и как это может повлиять на так много машин, как это. Таким образом, в моей руке вот пресс- релиз, который был выпущен в EPA-- Экологический Агентство по охране, которые это регулирующий орган США, что ручки экологических проблем, и затем фактический официальное уведомление, что было отправить Volkswagen всего несколько дней назад. Таким образом, по охране окружающей среды, пишет, и в настоящее время раскрывает публично, сложные программное обеспечение Алгоритм на некоторых Автомобили Volkswagen обнаруживает когда автомобиль проходит Тестирование официальные выбросы и превращается полные выбросов контролирует только во время теста. Эффективность Эти транспортные средства загрязнение Устройства управления выбросы сильно снижается во всех нормальных вождения ситуации. Это приводит в автомобилях, удовлетворяющей как Стандарты в лаборатории тестирования или станция, но во время нормальной работы излучают oxides-- азота или NOx-- со скоростью до 40 раз стандарт. Программное обеспечение производства Volkswagen цитата конец цитаты, поражение устройства, как определено чистого Закон Воздух в США. Они идут на говорят, что по охране окружающей среды и другое агентство раскрыли поражение устройства Программное обеспечение после независимого анализа исследователями Запада Университет Вирджинии. Загрязнение NOx способствует диоксид азота, приземного озона, и мелких частиц дело. Воздействие этих загрязнители была связана с широким диапазоном серьезные последствия для здоровья, в том числе повышенной астмы атаки и другие респираторные болезни, которые могут быть достаточно серьезными, отправить людей в больницу. Воздействие озона и твердых частиц также имеет были связаны с преждевременным смерть из-за дыхания, связанные или сердечно-сосудистых эффектов. Дети, пожилые люди, люди с существовавшие ранее респираторные заболевания особенно подвержены риску последствия для здоровья этих загрязнителей. Достаточно сказать, это довольно серьезно. И давайте на читать еще один отрывок и тогда мы будем смотреть на основные последствия это в контексте машине. В частности, Volkswagen изготовлены и установлены Программное обеспечение в так называемый электронное управление module-- или ECM-- из эти транспортные средства, которые зондирования когда транспортное средство был опробован для соблюдение норм выбросов EPA. Основываясь на различных входов в том числе Положение рулевого колеса, автомобиль Скорость, продолжительность двигателя эксплуатация и барометрического давления, эти входы точно отслеживаются параметры федерального процедуры испытания, используемого для Тестирование выбросов для сертификации EPA целей. Во время тестирования выбросов ЕРА, программное обеспечение транспортных средств ECM побежал программное обеспечение, которое производится Результаты совместимые выбросов. На всех других случаях, автомобиль ECM программное обеспечение побежал отдельный дорогу Калибровка что снизило Эффективность работы Общая система контроля за выбросами, в частности, селективного каталитического снижение NOx Lean trap-- который мы увидим через мгновение. В результате, выбросы NOx увеличена с коэффициентом 10 до 40 раз выше уровня, соответствующих EPA В зависимости от типа привода цикла. Так что же это на самом деле означает, и Исходный код программного обеспечения работающем на Volkswagen имеет не еще были публично раскрыты, является то, что, фактически, это эквивалентно где-то там внутри кода Фольксвагена. Если вы проходят испытания, и если автомобиль обнаруживает определенные экологические факторы как рулевое колесо положение или движение или ее отсутствие в машине или любое количество других факторов которые в настоящее время гипотеза чтобы быть частью этой формулы, они просто включите Полный контроль выбросов. Другими словами, они начинают излучающие меньше загрязняющих веществ. В противном случае, в любой другой ситуации когда он не обнаружен как в лаборатории, они просто не делают. И так можно упростить это в более бетон псевдокод с чем-то как это. Если колеса поворачиваются, но руль нет, наводит на мысль что автомобиль находится на некоторые вид вращающегося цилиндра но в какой-то склад проходят испытания, то, как ведут себя EPA хочу, чтобы вы. В противном случае нет. Итак, давайте взглянем на коротком видео, смотрит на то, что последствия имеют это на самом деле механически. [ПРОИГРЫВАНИЕ ВИДЕО] -за Пятницу по охране окружающей среды объявило, что некоторые Автомобили Volkswagen Audi между 2009 и в этом году были с помощью так называемый поражение устройство чтобы обойти законы выбросов предназначен для поддержания чистоты воздуха. Но что это означает? Ну, современные автомобили имеют десятки компьютеров внутри них. И некоторые из этих компьютеров помочь координировать функции двигателя для оптимальной производительность, убедившись, что есть не слишком много мусора выходит из выхлопной трубы. Они на самом деле работает Таким образом в течение нескольких десятилетий. В принципе, каждая часть двигателя современного автомобиля имеет датчик или контроллер на нем, и эти компьютеры читают в данных тысячи раз в секунду корректировки чая как отношение топлива к воздуху что происходит в цилиндры. Они обманывают Volkswagen и Audi моделей дизелей, и дизели имеют еще один действительно важная компьютерная контролируемые параметры, что является количество несгоревшего топлива происходит в выхлоп. Теперь это звучит плохо. Не звучит, как вы хотели бы, несгоревшего топлива происходит в выхлоп. Но в случае включения дизель, у вас есть что называется ловушка NOx, который является устройством, которое поглощает и ловушки для оксидов азота что загрязняющие вещества, которые в противном случае перейти в атмосферу. И эффект от этого NOx ловушку усиливается с несгоревшего топлива. Таким образом, поражение устройство является специальная программа внутри этих компьютеров, которые могут сделать это выглядеть автомобиль отвечает излучение стандарты, даже если он этого не делает. Volkswagen были проблемы на своих руках. Его дизельные двигатели были известны для получения большую экономию топлива, но ловушка NOx хорошо работает только когда больше топлива используется. Таким образом, автомобиль будет обнаружить, с помощью этого устройства поражение, когда он был получать выбросы Тест, он будет использовать больше топлива, сделать ловушки работу NOx также, выбросы будет в порядке. Но тогда вы получите на дороге, устройство выключается, вы сжигание меньшего количества топлива но вы положите столько, сколько 40 раз больше загрязняющих веществ в атмосферу. Но как, черт возьми автомобиль знаю, что это было испытывается на соответствие выбросов? ЕРА говорит, что это был сложный система, которая проверяется вещи как руля, Скорость, как долго двигатель был включен, и даже атмосферное давление. Другими словами, было нет способ это не было случайным потому что программное обеспечение было предназначен очень тщательно, чтобы обнаружить официальный трубочиста. Вот некоторые довольно серьезные обман и это почему Volkswagen в такие серьезные неприятности. На самом деле, их генеральный директор, Мартин Винтеркорн, только сошел. Так что же происходит дальше? Ну, если вы один из полутора миллионов дизельные Jettas, Битлз, Гольфы, Пассаты, или Audi A3s осуществляется, хорошие новости есть что ваш автомобиль по-прежнему безопасно ездить. Вы не должны положить его прочь до Volkswagen не выдает отзыв. Но в какой-то момент они вероятно, придется обновить программное обеспечение внутри вашего автомобиля. Когда это произойдет, вы могли бы получать меньше миль в баке. Адвокаты уже готовится на исков Таким образом, владельцы, возможно, получить компенсацию в какой-то момент в будущем. Но это не собирается произойдет в ближайшее время. [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: Так это на самом деле поднимает интересная картина вопрос больше а доверять. Правильно? У всех нас есть айфонов или Андроиды или что-то в наших карманах, скорее всего, в эти дни, или ноутбуки на наших коленях, которые работает программное обеспечение сделал Яблоком и Microsoft и гроздья других компаний. Но как мы знаем, что то, что Эти программные продукты делают на самом деле, что это компании говорят, что они делают? Например, кто должен сказать, что каждый раз, когда вы сделать телефонный звонок на ваш iPhone или Android-телефон или т.п., что это номер телефона также не загружается на сервер какой-нибудь компании из-за некоторых программе вы имеете написал, будь то операционная Сама система, как прошивкой или Android, или потому, что вы скачали некоторые приложения третьих сторон что-то слушает чтобы все вы печатаете или все, что вы на самом деле говорят. Как вы знаете, что, когда вы, ребята, работаете Clang или сделать, чтобы скомпилировать собственное программное обеспечение в CS50, как У вас есть персонал, который CS50, в путем библиотеке CS50, не было входа каждый строка, которую вы когда-либо получали или каждый дюйм вы когда-либо получали? Ну, вы, безусловно, может выглядеть в исходном коде что-то как библиотеки CS50, вы мог смотреть на исходный код для операционной системы Linux работает на CS50 IDE. Но удивительное представление было дано в 1984 году в получении премии Тьюринга на а очень известный ученый известен as-- имени Кен Томпсон, который получил премию Тьюринга, которая является своего рода компьютер Науки Нобелевская премия, если хотите, за работу по Операционная система называется Unix, который очень похож на дух, что мы используем, который является Linux. И вопрос спросил он его принятие речь, по существу, устанавливающий рамки для годы и годы обсуждения о доверии и безопасности, это было. В какой мере одним доверять Утверждение, что program-- кусок из software-- бесплатно троянских коней? Может быть, это более важно доверять люди, которые написали программное обеспечение. И в самом деле, мы связаны к разговору, что он дал, принимая эту награду в 80-х на сайте CS50 в под стр лекции на сегодняшний день. Потому что то, что вы увидите является то, что он на самом деле дает довольно простой пример того, как даже компилятор Clang, как или что- компиляторы другие, используемые в прошлом, что, если встроенные в компилятора сами используете мало, если состояние, которое по существу говорит, если вы заметили, что этот код использует функция GetString или GetInt Функция, идти вперед и вставьте задняя дверь или троянский конь например, что эта программа в настоящее время имеет некоторые нули и те, которые делают что-то вредоносное. Вход все ваши нажатия клавиш, загрузка этих данных в какой-то сервер, или действительно что-нибудь. И то, что Кен Томпсон идет на сделать в беседе чтобы продемонстрировать, что даже если у вас есть доступ к источнику код компилятора, который злостно может делать это, это не имеет значения, потому что есть эта курица и яйцо Реальность прошлом многие лет в результате чего составители используются для компиляции самих себя. Другими словами, путь назад, когда кто-то пришлось бы написать первый компилятор. И после этого, в любое время они обновляются компилятор, изменив исходный код, добавляя новые возможности и перекомпиляции для людей вроде нас, чтобы использовать, ну, они используют старый версия компилятором собрать новый версия компилятора. И если вы посмотрите на разговоры, что он дал, вы увидите, что из-за этой округлости, Вы можете на самом деле имеют ошибки или Троянские кони встроен в программное обеспечение мы используем. И даже если вы посмотрите на Исходный код для этих программ, она не может быть даже видно потому что обман на самом деле в какой-то старой версии компилятор, который с тех пор был инъекционных угрозу в нашем программном обеспечении. Какие только говорить, что мы действительно не может и не должен доверие программное обеспечение работает на наших ноутбуках или телефоны или любое количество мест. И в самом деле, позже в этом семестре, когда мы начинаем говорить о веб-программировании а на самом деле начать строить веб-приложения, самостоятельно выходить мы поговорим о них угрозы и др. Теперь вы, наверное, задавались и заметил, что было крошечное Дарт Вейдер в клипах, что Грань показывал там о Volkswagen. Если Вы никогда не видели, я думал, что мы должны облегчить настроение, потому что это все очень удручает и пугает. Я собираюсь оглядываться назад на Super Bowl 2011 когда коммерческая по Volkswagen-- и это почти делает их симпатичным again-- эфир впервые на телевидении. Это второй зажим 60 Я думаю, что вы будете наслаждаться. [ПРОИГРЫВАНИЕ ВИДЕО] [МУЗЫКА - тема из "Звездных войн"] [Собака лает] [Машина начинает] [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: Да. Я просто проверял. Этот автомобиль находится в списке нарушений. Все в порядке. Таким образом, мы рассмотрим некоторые ПСЕВДОКОД минуту назад. А вот больше фрагмент псевдокода кода что мы видели несколько раз до сих пор. И давайте использовать это возможность Теперь, чтобы ввести новые программы метод, который мы сделали см алгоритмически на прошлой неделе, когда мы смотрели на сортировки слиянием. Но давайте формализовать его и посмотреть, как мы могли бы использовать его в реальный код, а затем мы собираемся использовать это Техника по дороге наиболее вероятно, чтобы решить определенные другие проблемы. Так что это был один из первых программ, которые мы либо писал, хотя и в псевдокода кода. И то, что эта программа позволило нам сделать курс было найти Mike Smith в телефонной книге. И обратите внимание, в частности линий восемь и 11, которые были это заявление Go To. И в самом деле, некоторые языки, С среди них, на самом деле есть Утверждение, что буквально перейти к тому, что позволяет перейти к определенной строке. Это правило, с неодобрением, поскольку это может быть очень легко злоупотреблять и вы можете начать прыгать вашего Программа повсюду, в отличие к использованию такой логика и поток управления что мы использовали до сих пор только с Петли и условия и тому подобное. Но мы можем упростить этот алгоритм в псевдокода кода следующим образом. Вместо этого итеративного или цикл подход где мы все время возвращаюсь и назад и вернуться к линии три, почему мы не просто вид Пунт и более как правило, говорят, в соответствии семь и 10, просто заменить эти два пар линий с, иначе, если Смит ранее в книге мы будем искать Майка в левая половина книги. Иначе, если Смит позже в Книга, поиск Майка в праве половина книги. И заметьте, уже округлости. Правильно? Я ищу Майка в телефонная книга, а затем В конце концов я попал, может быть, Линия семь или, может быть строка 10 и моя инструкция себе это поиск Майка в половине телефонной книге. Ну, как мне найти Майка? Я в середине поиск Майка, почему вы вроде отправки меня в круг? Но это нормально, потому что то, что происходит с размером проблемы, как написано в строке 7 и 10? Мы не просто говорю поиска Майка, искать Майка. Мы специально говорю, что? Поиск для него в левой половине правая половина которого эффективно половина размер проблемы. Так что это нормально, что мы вроде Участвуя в этом округлости, это порочный круг, потому что, по крайней мере, мы что делает проблему все меньше и меньше. И в конце концов мы собираемся достичь что так называемая база случай, когда у нас есть только одна страница left-- как наш волонтер прошлой неделе did-- мы имели одну страницу налево, а затем мы не должны продолжать искать Майк Смит потому что он либо на этой странице или он не является. Так как мы можем реализовать эту идею, это Сортировать округлости в реальный код? Ну, мы можем использовать метод который обычно называют рекурсией. И мы видели это в псевдокод для сортировки слиянием на прошлой неделе. Напомним, что это был псевдокод для сортировки слиянием. Это возможно даже проще, чем пузырь выбор или вставки рода только с точки зрения простоты с помощью которого можно выразить это. Но это потому, что Мы вроде круговой говоря, искать что-то ища его снова. Но мы ищем либо на левая половина или правая половина и затем в конечном счете мы слияния в этом случае. Но здесь, также, с эти два сортировки линии, же мы опять это Идея рекурсии. И конкретно это означает, что, в контексте алгоритма, является то, что алгоритм является рекурсивным если он использует или называет себя. Или с точки зрения C, функция является recursive-- функцию под названием Foo является рекурсивной, если Foo, где-то в его исходном коде, вызывает сама функция Foo. И это плохо, если все Foo-либо делает это называть себя снова и снова. Это нормально, если Foo в конечном итоге останавливается, как это делает сортировка слиянием, говоря, погоди, Если эта проблема супер Небольшой, например, или я нашла того, которого я ищу, просто вернуть. Не рекурсивно, не циклически называть себя снова. И так давайте взглянем на как это может на самом деле работают. Так что я собираюсь идти вперед и открытым до двух примерах исходного кода здесь. Один из которых называют сигма 0. И это вовсе не рекурсивная, но давайте Взгляд на то, что эта программа делает. Я раздели все комментарии от него, но все исходного кода на CS50-х Сайт имеет комментарии, если вы хочу, чтобы прочитать это позже. И давайте сделаем пару здравомыслия проверяет здесь. Таким образом, в верхней части этого кода, у нас есть включать CS50.h. Что это делать? Почему это здесь? В условиях разумные непрофессионала. Что оно делает? Да. АУДИТОРИЯ: Так что функция GetInt работает. Дэвид Дж Малан: Так что функция GetInt работает. Из-за этого внутри Файл, CS50.h, что мы увидим в скором времени в сроки его исходный код, имеет кучу функций declared-- GetInt, GetString, и куча others-- и если мы на самом деле есть, что Включить линию, компилятор Clang не будет знать, что он существует. И же самое касается линии два, где INT определяется Printf, которая является функцией мы продолжать использовать совсем немного. Теперь, четвертая строка, кажется, немного Funky потому что это просто один лайнер. Это не имеет точку с запятой, не вьющиеся брекеты, нет кода внутри него. Но то, что мы называем сделал эта вещь в прошлом недели? Да. Таким образом, прототип. И почему у нас есть Прототип, который, кажется, чтобы быть немного излишним как правило, потому, что мы обычно посмотреть функцию еще раз позже в файле, не так ли? Так почему же мы have-- вы просто чесать голову, но я возьму его. Да. АУДИТОРИЯ: [неразборчиво] Функция после основной. Дэвид Дж Малан: Точно. Так что компилятор знает, что вы в конечном счете определяют или осуществлять что функция после основной, по-видимому. Так Clang и наиболее компиляторы рода немой и они будут знать только то, что вы говорите им. И если вы хотите использовать функция называется сигма, Вам лучше учить компилятор что она существует в заранее. Теперь, главный сама, даже хотя это куча линий, довольно знакомы, мы надеемся, в настоящее время. Это есть делать во время цикла чья цель в жизни здесь, по-видимому, чтобы получить целое положительное число от пользователя. И просто держать приставать к нему или ее, пока они не сотрудничают. Затем в строке 16 у меня есть интересный вызов. IntAnswer. Какой на левой руке сторона дает мне Int которые могут store-- называется Answer-- который собирается хранить, по-видимому, возвращаемое значение сигма. Так сигма это просто произвольным, но значимое имя что я дал, чтобы функции чья цель в жизни взять один argument-- мы будем называть его N в этом case-- и просто взять сумму от этого числа плюс каждый положительное число, что это меньше, чем это. Так что, если я прохожу в числе 2 к сигма, я хочу, чтобы добавить 2 плюс 1 плюс 0-- не 0-- так, что дает мне 3. Если я прохожу в 3 сигма, я хочу, чтобы есть 3 плюс 2 плюс 1, что дает мне 6. И так далее. Так это только добавляет до все число меньше или равен ему. Теперь, здесь я только собираюсь распечатать ответ. Так как быстрая проверка на дурака, давайте сделать сигма 0-- точка слэш сигма 0-- и позвольте мне ввести 2. И я действительно получить 3. Позвольте мне ввести 3. Я действительно получите 6. И если кто-нибудь может сделать математику быстро, если я 50, что я собираюсь получить? АУДИТОРИЯ: [неразборчиво]. Дэвид Дж Малан: Ну, нет. Но 1275, который довольно близко. Так что это результат того, 50 плюс 49 плюс 48 плюс 47 плюс 46 все, вплоть до 1. Так что все сигма делает. Но давайте посмотрим, как мы реализованы сейчас. Так здесь является сама функция. И это, похоже, не ничего общего с рекурсии еще. На самом деле, мы используя старая техника школы. Я инициализации переменной называется сумму к нулю, то у меня есть foreloop здесь, и я объявив Int названием Я, полагая его равным 1-- хотя я мог установить его равным нулю, но так как я делаю добавление, кто заботится, если это ноль или один. Это происходит не имеет никакого эффекта. Так что я итерации до тех пор, как я это меньше или равен м, что является аргументом, который был принят в. А потом я просто держать увеличивая И. и понимание петли все, что я делаю делает сумму плюс равна I. И это преднамеренным. Я не хочу делать, в этом так, как суммы плюс плюс. Я хочу, чтобы на самом деле добавить текущее значение I которые становится все больше и больше и больше в проточной подсчет. А потом я вернусь сумму. И так ответ получает значение суммы. И тогда я распечатать его. Так есть возможность здесь, хотя, вроде упрощения этот код концептуально и вид удара одного это ум в терминах Простота, даже если это требуется время, чтобы разобраться из понять, почему это является мощным в этих небольших примеров. Вот сигма одно-- так Вторая версия этого кода. Все наверху идентичен так что же история относится, как и прежде. Но теперь давайте посмотрим на Реализация сигма, которые Я сократился до только эти lines-- четыре строки кода, на самом деле, плюс некоторые фигурные скобки и пробелы. Но что я делаю? Если т меньше или равна нулю, мне нужно, чтобы вид обработки что супер простой случай. И если вы передать мне ноль или ничего негатив, который является просто странно, Я просто хочу, чтобы произвольно но последовательно возвращать ноль. Я не хочу эту вещь к попасть в какой-то странной бесконечность цикл из-за отрицательного значения. Так что я просто говорю, что если вы дадите мне нулю или меньше, я возвращаюсь к нулю. Но это хорошо, потому что это что одной страницы телефонной книги что осталось. Я откусывая очень конкретную проблему и не называя что-то рекурсивно. Но в строке 31, то я, кажется, делают? Скобки просто держать вещи, надеюсь, немного яснее. Но все, что я делаю, я возвращение M-- все Вы вручаете me-- плюс Значение M-- извините, плюс значение сигма М минус 1. Итак, что же это значит? Если вы дадите мне номер 3 в качестве входных, ответ, который я хочу, чтобы получить, в конечном счете 6, потому что 3 плюс 2 плюс 1 дает мне 6. Но как я могу думать о как этот код работает? В первый раз я называю сигма и я прохожу в значение 3, это, как говорят на куске бумаги, вот значение 3 и я был принят в качестве сигма это. 3, очевидно, не меньше, чем 0, так состояние ЕСЛИ не применяется. Остальные. Так что мне делать? Я хочу, чтобы вернуться м, что является 3, плюс сигма минус 1 м. Итак, позвольте мне отслеживать это. Я собираюсь поставить это лист бумаги вниз. И то, что значение, чтобы быть ясно, я собираюсь пройти в сигма в этой точке в истории? Какой номер? 2, верно? 3 минус 1 2. Так что я просто нужно немного клочок бумаги здесь. Так что теперь сигма вызывался снова. И я сознательно положил это вниз, потому что это вроде как паузу что версия истории потому что теперь я сосредоточен по сигналу от минус 1 м. Так м был 3, м минус 1 2. Так вот 2, что я был принят. 2, очевидно, не менее 0, так что дело не применяются. Иначе я вернусь м, что это вещь, плюс сигма какой стоимости? Так что, если сигма 1-- потому является м сейчас 2 SO 2 минус 1 1. Так что теперь у меня есть только значение 1. Я передаю только номер 1 к функции sigma-- или сам here-- так 1, очевидно, не меньше нуля, до сих пор не применяются. Иначе возвращение 1 плюс сигма что? 0. Итак, позвольте мне просто помните, что. Я вернусь к этому позже. Теперь я собираюсь идти вперед и йота вниз номером 0, потому что это мой аргумент или параметр. Я прошел ряд 0 и, наконец, этот процесс просто повторяя себе объявление тошноты вовсе прекратить, потому что то, что я сразу делать, когда я вижу эту 0? Я возвращаюсь к нулю. Так что теперь у вас есть, чтобы перемотать историю. Если я теперь идут назад во времени, то, что было самым последним, что Я сделал, если бы вы были в буквальном смысле перемотки видео? Я собираюсь забрать последнее 1, и это дает мне 1 плюс 0 равно 1. Если я буду перемотки история, что собирается дать мне 2 плюс это работает значение, которое равно 1. Так вот 3. А потом я собираюсь держать перематывать. Когда я впервые положил число 3-- так 3 плюс 3 дает мне 6. А теперь, если вы перемотана видео вплоть до этого момента, это было очень Я спросил первый вопрос. Когда прошло 3, что сигма 3? Это действительно 6, сумма все эти кусочки бумаги. Так что, если требуется некоторое время, чтобы обернуть ваш разум вокруг, это нормально. Но учтите, что это little-- него был очень преднамеренным, что я сложены эти числа друг на друга. Это вроде как имеющие memory-- запись времени, как скруббер в видео, что я могу действительно назад в. И мы собираемся вернуться к что метафора только немного. Но сначала, оказывается, что есть много вундеркиндов и смешных людей, Я думаю, на Google. Кто-то, кто очень хорошо погуглить виду подойдя на мгновение и помочь мне искать что-то? Очень, очень низкий ключ. Кто-то, кто никогда не Перед придумать, пожалуй. ХОРОШО. Да? Давай. Идем вниз. Как тебя зовут? Сэм Сэм. Дэвид Дж Малан: Сэм, давай вниз. Это то же самое. Приятно познакомиться. Привет. Приходите. Так что мне нужно, чтобы ты, если Вы могли бы, Сэм, вот Google. Вы можете искать термин рекурсии? Не испортить. А теперь let's-- да. Нажмите ОК, что. Лучше нажмите что. Ах, получить его. Нет? ХОРОШО. Так давайте сделаем пару других. Не так много, связанные академически здесь, но вы либо искали Google для анаграммы? СЭМ: Нет. Дэвид Дж Малан: ОК. Поиск анаграммы вместо рекурсии. Как насчет криво. Вы когда-нибудь искали криво? Теперь, этот немного трудно видеть, но мы надеемся, everything's-- ОК. Это только ты и я наслаждаюсь этим. ХОРОШО. Итак, наконец, это one's-- это немного криво. Теперь сделать бочку. Замечательно. Все в порядке. Большое спасибо Сэму. Ну вот. Спасибо. Так что же происходит на всего из этих глупых примеров? Так на самом деле, под капотом Миллионы Google, строк кода по-видимому, несколько глупо, если Условия, которые по существу проверки, если пользователь имеет набрали в этой фразе, сделать что-то, что, вероятно, взял нетривиальная количество времени осуществить только забавно в этом пути. Но это все, что кипит до под капотом. Но, конечно, рекурсия более из geekier пример среди тех особых хитростей. И, конечно, есть другие там а также, что мы, возможно, даже не обнаружил только пока. Так взгляните, или рассмотреть Теперь следующая программа, и, конечно, захватить любой из них на выход. Я собираюсь идти вперед и открыть программу, которая собираюсь попробовать поменять два значения. Но прежде чем мы туда, давайте сделаем это. Можем ли мы получить еще один Работа на общественных началах, я думаю? Хотите стать волонтером? Нет? Давай до. Давай до. Все в порядке. Так ваше имя чего? Лорен: Лорен. Дэвид Дж Малан: Лорен. Приходите на вверх, Лорен. Так Лорен быть вызов здесь следующим образом. Приятно познакомиться. Так Лорен здесь есть перед ее двумя пустыми чашками. И у нас есть некоторые оранжевый сок и немного молока и мы собираемся пойти вперед и делать следующее. Мы просто собираемся, чтобы заполнить этот. Через несколько унций молока сюда и давайте заполнить небольшую апельсиновый сок здесь. И напротив всех эти зрители, поменять местами два значения этих чашек. Поставьте апельсиновый сок в чашку молока и молоко в чашку апельсинового сока. Как бы вы это сделать, если вы были в домой и имели доступ к другим поставок? Лорен: Положите его в другую чашку. Дэвид Дж Малан: ОК. Итак, давайте временно Переменная, если мы сделаем это. И идти вперед сегодня, а осуществить Такую же процедуру замены. Так хорошо. Мы поместили OJ во временное Переменная, молоко в переменной OJ, и в настоящее время временная переменная в переменную молока. ХОРОШО. Так очень хорошо сделано до сих пор. Так что получается, что out-- провести думал на мгновение. Здесь просто выродок это немного, это будет соответствующая С-код что мы просто реализуется. У нас было два входа, а и б, оба которые мы просто скажем, для простоты INT годов. И обратите внимание, здесь, если я хочу поменять значения двух переменных А и В, мы действительно нужен посредник, А временная переменная, временное чашки, в которой заливают одно из значений так что у нас есть заполнитель для него. Но затем код в точности а Лорен здесь реализованы. Теперь, только, чтобы получить немного сумасшедшим, оказывается что вы можете сделать это без временная переменная. Чтобы сделать это правильно, хотя, мы собираемся чтобы обмануть с некоторыми химии. У нас есть некоторые дополнительные чашки здесь. Таким образом, ближе всего, что выглядит как молоко и воду perhaps-- или молока и OJ-- это у нас есть некоторые вода, так что мы будем заполнять это одно вверх с несколько унций чистой воды. Это, вероятно, слишком много. Да. Это, безусловно, слишком много. Держите на одной сек. А теперь у нас есть нефть, которая, как я вспоминаю от средней школы химии класса, мы надеемся, это не смешивается с водой. Но это своего рода вид выглядит, как молоко и OJ. Так что теперь, без использования временная переменная, Вы можете поменять эти два значения? Так масла идет в чашку воды, вода идет в чашку масла. Лорен: Нет другие чашки? Дэвид Дж Малан: Никакие другие чашки. И я на самом деле не испытал это прежде, чем в этом году так что я не знаю, если это будет на самом деле работают химически. Это не должно было случиться. Работает? Все в порядке. Так разделения? Хорошо. Теперь мы получили, чтобы получить воды в другой чашке. Smarter концентраторы химия мог вероятно, сделать это лучше меня. Lauren: воды на дне. Дэвид Дж Малан: The water--, что было что ключ в последний раз мы сделали это. Вы должны сделать это в правильном порядке. Да. Ничего страшного. Так что теперь у нас есть две чашки масла. ХОРОШО. Ничего страшного. Но если это химически работал, чем i-- Лорен: Это вода. Дэвид Дж Малан: Это в основном вода. Все в порядке. Но это все тот же стакан, как раньше. Так залить it-- попробовать там. ХОРОШО. Это хорошее использование времени класса сегодня. ХОРОШО. Так что теперь we-- приятно. Вроде. Все в порядке. Так очень хорошо. Спасибо Лорен. Очень хорошо сделано. Так что просто взорвать ваши умы, и это, пожалуй, что-то играть с, если вам нравится в CS50 ID, Вы можете, на самом деле, поменять две переменные без использования временного целое число. И это соответствующий код С. И если вы помните из прошлого Среда, мы ввели, если кратко, некоторые новые операторы в С и делает кто вспомнить, что маленький морковь символ, что мало треугольной Символ с клавиатуры представляет? Что побитовое оператор? АУДИТОРИЯ: EXOR. Дэвид Дж Малан: EXOR. Эксклюзивный Или. Так что, если вы хотите, просто для удовольствия на домой, чтобы дать и б два произвольных такие ценности, как любой eight-- и I будет выбрать восемь битное значение. Если вы сделаете это с 32 бит, Вы очень быстро надоедает. Но просто дать восемь бит Значение это все, один или два, и дать б аналогичной стоимости. А потом, используя определение из XOR с прошлого среду, применять эту понемногу, каждый из эти восемь битов в каждой из А и В, а затем сделать его именно за этим кодом. И это не то, что неправильно Вы видите здесь на экране. Это действительно сводится трех операций XOR и каким-то волшебным а и б обменяются позиции без потери информации. Таким образом, нефть и вода трюк является Ближайший реальный мир воплощение Я мог думать о том, что, чтобы имитировать. Но, безусловно, это проще использовать временную переменную, как в этом случае здесь. И это тоже возможность сказать, тоже такая микро оптимизации, в качестве компьютерного ученого хотел бы сказать, в то время как забавно хвастаться о том, как вы сделали это без как обмен с дополнительной переменной, это еще не все, что убедительно. Потому что, чтобы сохранить 32 бит, как в случае фактического Int, это не все, что убедительных в системе, где вы могли бы использовать десятки мегабайт или даже больше, например памяти в эти дни. И в самом деле, когда мы получаем на более поздний поставленной задачи и вы реализуете заклинание проверки, и вы будете быть оспорены, чтобы сделать это с это как маленькая оперативная память и лишь Время, как можно на computer-- вас еще есть неделя, чтобы реализовать it-- вы have-- вы будете вызов, чтобы минимизировать эти ресурсы. И это на самом деле только Случай этот семестр где вы будете поощрять бриться от даже лучших производительности стоит иначе. Так что-- как мы можем увидеть их в коде? Позвольте мне идти вперед с предприятием и открыть пример что намеренно называют Нет своп, потому что это не на самом деле поменять переменные как вы на самом деле могли бы ожидать. Итак, давайте взглянем. Вот программа, которая не имеет CS50 Библиотека происходит, просто стандартный ввод / вывод. Теперь у нас есть прототип для подкачки наверху, который только означает, что он должен быть определен позже. А вот главный. Я произвольно назначены х и у, соответственно, одним значения и два только потому, что они маленькие и легко, чтобы думать. А потом я просто есть куча printfs где у меня есть простой тест. х 1 и у является 2 предположительно что эти printfs скажу. Так что нет магии до сих пор. Тогда я собираюсь утверждать с печатать четкости, обмен точка точка точка. Я собираюсь позвонить своп Функция, проходя по х и у. И давайте предположим, что сейчас своп осуществляется точно как это было некоторое время назад с временной переменной. И так я утверждаю, смело, местами. х теперь это и теперь у этого. Но файл, конечно, не называется Нет своп. Итак, давайте на самом деле посмотреть, что происходит. Если я не компиляции не своп, а затем сделать ./noswap, х 1, у 2. Подкачка местами. х равен 1, у 2. Так что на самом деле, кажется, даже недостатки хотя swap-- давайте прокрутите вниз now-- реализуется именно в соответствии с Код я предложил некоторое время назад. Таким образом, мы не собираемся, чтобы получить фантазии с XOR вещи на данный момент. Это тоже должно работать как с молоком и OJ, но это, кажется, не работает. Так давайте сделаем это снова. Может быть, я просто не работает правильно. Так что давайте не работать Нет своп снова. Может быть, я-- нет. Так что это просто не работает. Так давайте сделаем небольшой проверку вменяемости. Позвольте мне идти вперед здесь, в своп и просто добавить, подождите минуту, а есть% I / N и давайте плагин в значении а. Потому что я действительно хочу чтобы увидеть, что происходит. И в самом деле, это техника отладки что вы могли бы использовать в офис часа или в уже дома, сродни первой половине Дана Видео Armendariz в PSET3 где мы ввели печати Def, как рекомендуемый метод, по крайней мере, для простых случаев. Позвольте мне идти вперед и работать сделать нет замены снова, ./noswap. Интересно. Так заметить, что, кажется, чтобы быть правдой. Икс 1, у 2, но это 2, когда В 1. Так эти двое каким-то образом поменялись но х и у не получают местами. Таким образом, чтобы было ясно, что происходит есть, здесь у меня есть х и у и те локальные переменные в Основная сфера, я передаю в х и у менять местами. Теперь, своп, как отдельной функции, бесплатно позвонить свои аргументы или его параметры все, что он хочет. Foo или бар или х или у или А или В. Просто чтобы понять, что они не совпадает с х и у по себе, Я сказал и б. Но мы могли бы назвать их, что мы хотим. И так, похоже, Своп прошло x-- АКА a-- и это передается y-- AKA б. Каким-то образом эти три линии обмен именно те ценности, как это сделал Лорен с молоком и OJ. Но когда мы распечатать ценности, а и б действительно поменять, но и х у нет никаких изменений в них. Напомним, что х и у здесь. Таким образом, мы можем видеть это с помощью другая техника, а также. И это тоже техника встроенные в задаче установить три. Давайте идти вперед и делать это в CS50 ID, если вы еще этого не сделали. На боковой стороны мы прямо есть эту вкладку Debugger. И если вы открыть это, есть некоторые тайные сведения что бросил на вас изначально. Но давайте дразнить это помимо очень быстро. Таким образом, одна, вы видите локальные переменные. Оказывается, что строить в CS50 IDE, и много сред программирования более Как правило, это отладчик. Инструмент, который позволяет наглядно увидеть то, что происходит внутри вашей программы без необходимости прибегать к добавлению printfs и компиляции и запуска и добавление Printf-х и компиляции и бег, который уже в нерабочее время или дома, вероятно, становится довольно утомительным. Так вот, в мгновение, мы собираюсь видеть в режиме реального времени значения наших локальных переменных. Мы также собираемся быть в состоянии установить то, что называется останова, которые есть возможности в моей программе, чтобы приостановить выполнение в определенной строке кода что мне интересно, о. Правильно? Эти программы работают в секунду. Это своего рода хороший для нас медленных людей чтобы иметь возможность сделать паузу, воспользоваться моментом, см что происходит вокруг определенная строка кода без вспашки программы через него и заканчивая полностью. Таким образом, точки останова собирается позволить нам перерыв и пауза в определенной точке. Стек вызовов это причудливый способ говоря, что в настоящее время функции называют в настоящее время. Главная всегда вызывается первым. Но если Основной называет Функция называется своп, мы на самом деле происходит, чтобы увидеть это Башня функций, которые были называется в обратном хронологическом порядке. Итак, давайте посмотрим, что. Я собираюсь, чтобы уменьшить. Я собираюсь вернуться к моим кодом. И только потому, что я хочу, быть педантичным здесь, Я собираюсь идти вперед и нажмите только с левой стороны линии пяти. И, что создает красную точку. И обратите внимание, на правой стороне что отладчик знает, эй, Я просто сказал, что точки останова noswap.c линии пять, специально на этой строки кода. Так отладчик знает, что я просили в следующий раз Я бегу моя программа его паузу выполнение там, а не просто работает все это очень быстро. Так что теперь я собираюсь нажать на Debug Кнопка на самом верху IDE и что собирается делать следующее. Это собирается открыть первоначально несколько страшно глядя второй терминал window-- удаленной отладки с провести такое и such-- и мы вернемся к тому, что Все это означает, что в скором времени. Но, что важно сейчас является то, что, что красная точка попал, отладчик умышленно остановился execution-- Не на этой линии как таковой, а на первом линии фактического кода в этой функции. И вот почему линия находится семь Теперь выделены желтым цветом. А теперь давайте взглянем на правой стороне. Похоже, по умолчанию, достаточно хорошо, х имеет значение, какой? 0. И у имеет значение, какой? Нуль. И это можно ожидать в том смысле, что х и y--, что желтый line-- имеет еще не выполнены. Так х не должна иметь значение 1. Это может иметь любое другое значение, так называемый мусор значение. И нам повезло в том, что это нулю в этой точке, по существу. Так что теперь есть только несколько Кнопки мы должны заботиться о при отладке таким образом. Обратите внимание, здесь мы имеем кнопку воспроизведения. И если мы будем играть или нажмите резюме, это просто собирается запустить через остальная часть программы или до тех пор, пока парад еще одну точку останова. Но я не установил любой другой останова, так это просто собирается запустить до конца. Это вид поражений Цель ковыряться. Так вместо этого, я забочусь о Эти значки справа. И если я наведите курсор мыши на их, как вы должны тоже, Вы увидите маленькие tips-- подсказки. Это один перешагнуть. Теперь это не значит, пропуск следующая строка кода. Это просто означает, выполнить его и перейти к следующей, перейти к следующей, перейти к следующему. Другими словами, с помощью что кнопка, я могу ходить через мой код один шаг за один раз. Линия за линией, в буквальном смысле. Теперь справа что есть еще один что мы увидим в минуту. Это так называемый Шаг в иконе, что это собирается позволить мне погружение в другую функцию. Но давайте посмотрим это в мгновение. Так что я собираюсь нажать перешагнуть. А теперь обратите внимание, как я нажмите эта кнопка в верхнем правом углу, держать глаза примерно под местной Переменные и видеть то, что происходит с х. х теперь 1, поскольку желтая линия в настоящее время выполняется уже и мы переехали на линии 8. И через минуту у следует надеяться, станет 2. Теперь, что интересно ничего происходит немного. Все это является Printf. И обратите внимание, в моей средней терминала окна, я вижу выход печати DEF. И теперь у меня есть, чтобы сделать Решение программиста. Я могу перешагнуть эту линию Код, выполнение его, но не получать любопытно, что внутри. Или я могу на самом деле шаг в этом и идти внутри самой Swap. Так давайте сделаем последнего. Позвольте мне идти вперед и нажмите не Step Over, но Step Into. Заметьте, все вдруг изменения окна чтобы выделить первый строка кода в своп. Это линия 21. А теперь, что вид фанки, что, если вы посмотрите сюда, как и ожидалось, запятой б 1 и 2, соответственно. Почему температура 32,767? Напоминая, что темп, так же, как пустая чашка мгновение назад, объявлен здесь, на линии 21. Почему 32,000- Я имею в виду, почему это просто некоторые странные значение? Да? АУДИТОРИЯ: Это не инициализирован. Дэвид Дж Малан: Это не был инициализирован. Таким образом, наш компьютер всегда имеет физическую память. Это всегда имеет физическую память. И всегда есть Зеро и один находится в там, верно? Потому что мы, используя наши компьютер в течение всего дня, Вы используете IDE CS50 или серверы в течение всего дня. Так что ОЗУ либо имеет несколько нулей или кто-то или каким-либо нули и единицы. Независимо от того, или не вы их использования. Вы не можете просто пустой пространства, где вы хотите бит. Они либо нули и единицы. Так что получается, что темп, потому что мы не инициализирован еще, у нас есть эти 32 бита, но они уже не инициализирован любым известным значениям. Поэтому, что бы они были наиболее в последнее время используется for-- тех 32 bits-- мы просто видим артефакты некоторых предыдущая использование этих конкретных 32 бит. Как только я нажимаю Step Over, хотя, уф, температура будет получить значение 1. И если я сделаю это снова, а является будет дано значение 2 а затем б собирается присваивают значение 1. И так, что в настоящее время хорошо на эта точка в истории является то, что отладчик показывая мне, супер медленно в своем собственном темпе, то, что состояние своп. Но обратите внимание, в верхней здесь, уведомления что стек вызовов действительно имеет два слоя к нему. Теперь тот, который, как подчеркнул Обмен, если я нажимаю на Главное вместо обратите внимание, как изменить локальные переменные потому что разработчик может просто прыгать и пойти в любой другой области. Поэтому, даже если мы делаем все это работать и правильно замены А и В, если я иду туда и обратно между своп где а равно 2 и б равно 1 и Основной, Главная имеет пострадали вообще? Нет. Так что вынос здесь? Ну, получается, что любое время Вы вызываете функцию как своп, и вы передаете его аргументы, то, что вы передаете в функцию подкачки В этом случае является копией из тех аргументов. Так что, если х и у каждый соответственно 32 бита, то, что Своп получать в два новых местных переменные или аргументы, называется и В-, но те, являются произвольными names-- но модель нулей и те, внутри А и В выстроились должна быть идентична х и у но они не являются То же самое, как х и у. Это как если бы Основное имеет на своей части бумага число 1 и 2 для х и у, а затем, когда он передает, что лист бумаги, чтобы своп, Обмен очень быстро получает собственный ручка, записывает 1 и 2 по своей листе бумаги, руки назад оригинальный ху к основному а затем делает свой собственный что с а и Ь. И теперь это супер важно, потому что это имеет нетривиальные последствия за фактически писать правильный код потому что, казалось бы, мы не можем поменять две переменные. Я написал правильную функцию подкачки. Мы осуществили это с Лорен, как правильный функция подкачки на самом деле, но не по-видимому, ни одно из этих вопросы, если вы не можете на самом деле поменять два значения постоянно. Таким образом, мы должны еще один способ на самом деле получить на это, и мы должны быть в состоянии на самом деле решить эту проблему. И получается out-- и мы придем вернуться к этой конкретной картины Перед long-- это один из способов, что Вы могли бы сделать память компьютера. Это просто прямоугольник. Вы можете сделать это любой различными способами, но это удобно рисовать его как прямоугольник по следующей причине. Мы собираемся начать сегодня и за говорить о так называемой стек. И стек просто кусок из RAM-- кусок memory-- что функции имеют доступ , когда они называют. А так получается, что на В самом низу этой стопки где все локальные переменные в основных и орг С и орг V и все такое собираются пойти по умолчанию. И если Майне называет некоторые другие функции, как обмен, хорошо, Обмен собирается получить еще слой память над ним. И так просто, чтобы дать вам быстрый беглый картина эта, если я иду по here-- и позвольте мне зеркало это на накладные, как well-- что на самом деле у меня есть, если мы заботимся только о Дно этой картины сейчас, является то, что, когда я запускаю программу и главный вызывается, Главная дается кусок Оперативная память в моем компьютере, который в нижней части этой так называемой стек. И я собираюсь сделать это намеренно в виде квадрата. Так как 32 бит или четыре байта. И если это основная функция имеет переменная называется х со значением 1 и имеет переменную у со значением 2, это как принимать этот кусочек памяти, Главная дано операционной Система и деления его так, что первый локальная переменная идет здесь, второй идет здесь, и это все. Когда Главная призывает подкачка, своп получает свой собственный кусочек памяти что мы будем рисовать, как это от операционной системы, и это будет иметь свои собственные локальные переменные на основе на нашем реализации ранее с местными переменных а и б, что изначально получить значения 1 и 2. Но тогда, как только Своп код выполняет, и Лорен действительно меняет местами OJ и молоко, что происходит? Ну, это 2 в 1 становится, это 1 становится 2, и, кстати, есть переменная температура, которая является использовали эту все время, что в итоге уходит. Но это не имеет значения, сколько работы вы В этой линии of-- в этом пространстве памяти, х и у являются полностью нетронутым. Таким образом, мы должны каким-то образом давая Обмен и функции, как это Секрет доступа, если хотите, чтобы Функции like-- памяти как х и у. Итак, давайте взглянем на пример, который помогает нам увидеть то, что было происходит все это время. Я собираюсь идти вперед и открыть Сравнить Zero. И я собираюсь закрыть наш отладчик, я собираюсь чтобы закрыть эту страшную глядя сообщение только что говорит, подожди минутку, Вы находитесь в средней отладки. Я собираюсь скрывать эту вкладку здесь просто вернуться к простоте. Так что не волнуйтесь, если GDB убит. Это просто означает, что программа имеет было бросить, умышленно в этом случае, мной. А теперь Сравнить нуля это делает. Я использую CS50 Библиотека в стандартном I / O. Я получил основную функцию, что сначала говорит, что-то сказать, и получает строку. Тогда говорит это снова и получает другую строку. И заметьте, что эти две строки называются S и T, соответственно. А теперь эта программа, сравнение Ноль, его цель в жизни, он должен сказать мне, я типа то же самое? И поэтому я собираюсь обратно в неделю один. Я использую свой равный равного оператора которая является оператором качества. Не оператор присваивания, оператор равенства. Я просто сравнивая с и т. Итак, давайте на самом деле идти вперед и делать это. И я собираюсь идти вперед и сделать сравнение Zero. Я собираюсь сделать ./comparezero. И я собираюсь пойти вперед и что-то сказать как, давайте делать маме в нижнем регистре а как насчет мамы в верхнем регистре. И, конечно, я печатаю разные вещи. Все в порядке. Это следовало ожидать. Давайте запустить его снова. Оба раза сделать нижний регистр, нижний регистр. Это выглядит супер идентичны для меня. Войти. ХОРОШО. Может быть, это просто странно, потому что это не нравится мой грамматики. Так давайте сделаем капитала MOM, Столица MOM, идентичны. Разные вещи. Так почему же это? Ну, что на самом деле происходит на под капотом здесь? Итак, давайте вернемся в течение здесь на мгновение и рассмотреть, что GetString на самом деле делает. Когда вы звоните GetString, что это функция, которую мы сами писали и это как-то получает последовательность символов от пользователя. И давайте предположим, что первый Время я называю GetString, что дает мне кусок памяти, который выглядит, как это. И если я набрал в нижнем регистре м-о-m-- и то, что идет после него? Просто быстрая проверка здравомыслие. Обратная косая черта нулю. Мы знаем это. И помните, что мы играли вокруг с именем Zamila в и куча других имен когда Роб был здесь ищете на то, что происходит внутри памяти. Так что история точно такой же. Это то, что GetString возвращается ко мне. Теперь, мой код минуту назад храниться возвращаемое значение GetString в переменной называется с. И тогда во второй раз я назвал его, он хранил его в переменной называется т. Так что, если я иду сюда, мне нужно обратить на это местный переменная-- и я, как правило собирается нарисовать строку как просто-- мы будем называют его S-- как небольшой площади здесь. А теперь, как делает somehow-- мама перейти внутри этого переменного х? Ну, мы должны вернуться к изначальным принципам здесь. Что на самом деле возвращения GetString? Так что получается, что M-O-M Обратная косая черта нулю, и любое число других строк в памяти, как Zamila и Роб или Энди, или любые другие, , конечно, в нашем Оперативная память или память компьютера. И ваша память имеет like-- у вас есть гигабайт оперативной памяти, два гигабайта оперативной памяти, или миллиард, или два миллиарда байт, или, может быть, даже больше в эти дни. Итак, давайте предположим, для сегодняшних целей, что это не имеет значения, как мы номер им, но мы можем номер каждый из тех, миллиард или два миллиарда или четыре миллиарда байт. И давайте просто сказать, что угодно это первый укус, во-вторых прикус, третий, четвертый. Я намеренно не использую нуль для сегодня, но мы вернемся к этому. Итак, другими словами, если это Самый первый раз, когда я с помощью программы, Я просто везет, и первый укус на месте одного потом два потом три, чем четыре. И, если я не рисунок, номер ящика два миллиарда бы способ здесь. Так что вы думаете, то, GetString фактически возвращает? Это не возвращение М-О-М обратную косую черту нулевой таковой, потому что это явно не будет вписываться в окно, что я нарисовал. Так что еще может на самом деле GetString возвращаться все эти недели? Ответ на доска где-то здесь. Вы не можете поместить М-О-М обратную косую черту нулевой, так, что может иметь смысл, а? Если вы должны были быть супер умным, положив на так называемой инженерной шляпе, Что бы вы могли вернуться? Что наименьшее количество информации Вы могли бы вернуться, что бы еще позволяют найти M-O-M в памяти? Да? АУДИТОРИЯ: Одно. Дэвид Дж Малан: Одно. И почему один? АУДИТОРИЯ: Потому что скажет Вы куда идти [неразборчиво]. Дэвид Дж Малан: Точно. Я просто хочу, чтобы вернуть адрес строки, которые я получил. Адрес в этот случай место одним. Так что на самом деле хранится в S-- и каждая переменная строка, таким образом, far-- только было адрес этой строки. Между тем, если я называю GetString второй раз, и я введите в буквальном смысле тот же thing-- М-О-М с lowercase-- M-O-М и еще один знак нулю, и теперь, может быть, моя программа-х работает уже в течение некоторого времени, так, может быть, это 10, это расположение 11, это 12, это 13. Компьютеры, использующие некоторые другие памяти по какой причине. Что сейчас идет в мою секунду переменная в моей программе т? 10. В точку. И поэтому, когда мы смотрим на Исходный код этой программы где я просто пытаюсь сравнить два значения, это S равна равна т, что очевидное человека ответ? Просто нет, потому что 1 не равно 10. И так здесь, лежит возможность для нас на самом деле просто вернуться, опять же, в первую принципы и думать, хорошо, что происходит под капотом? Мы говорим о биты и байты и память, но это на самом деле полезно, чтобы понять потому что, когда вы звоните GetString, даже если мы думаем, что это из возвращение M-O-м или строку маму или Энди, или Zamila или и т.п., технически это просто возвращение адрес этого куска памяти. Но это нормально. Потому что, как я знаю, где строка заканчивается? Если я только дал начало? Ну, обратный слеш ноль, верно? Просто в линейном времени я могу распечатать с печатью четкости M-O-М. И как только я вижу обратную косую черту нулю, я не волнует, где я начал, Я уже знаю, неявно где мне нужно, чтобы закончить. И поэтому сегодня отмечает beginning-- и позвольте мне сделать это резко, потому что мы пошел через много неприятностей получить их здесь обучение wheels-- так что сегодня учебные колеса начинают оторваться и мы раскрываем в мере: [Аплодисменты] Это было хорошо стоит поездка на цель в это утро, да? Так now-- есть, получается из, нет такой вещи, как строки. Строка не существует. Это синоним, что мы имели внутри библиотеки CS50. Отныне мы собираемся начать называть с и т не строки, но символьные звезды. И символ звезды мы будем дразнить друг от друга, прежде чем длинный. Но это есть, что даже если мы будем продолжать используя GetString сейчас, технически я должен быть говоря сЬаг звезду и голец звезду. И получается, что это за звезда будет обозначать что-то называется указателем или адрес. И в самом деле, тизер за то, что лежит впереди это 20 второй клип от нашего друг Ник Parlante в Стэнфорде который, некоторое время назад, потратить смешное количество времени, как лучше я могу сказать в его кухня или его подвал, делает claymation введения в мир персонаж по имени Бинки, с которыми мы будем быть введены в следующий раз указателей. Так вот просмотр того, что должно прийти. [ПРОИГРЫВАНИЕ ВИДЕО] Эй, Бинки. Вставай. Это время для указателя удовольствия. -Что это? Узнайте о указателей? О, положительный герой. [КОНЕЦ ПРОСМОТРА] Дэвид Дж Малан: И на этой ноте, мы будем видеть Вас в среду. Все в порядке. Кто танцует? Давай. Кто танцует? Вы хотите, чтобы я, чтобы он начал? Я получу это началось. Woooo! Лорен: Сладкий фантазии Моисей.