Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

ДЯКУЄМО всім за допомогу!

2 uge_ne_tort вспомнилась цитата из известного фильма
«никогда не стоит недооценивать предсказуемость тупизны».
Объясните как вы на CS будете писать драйвера, ядро ОС или движок сервера (БД, игрушки, виртуальной машины или скриптового языка)? Перечислять можно еще долго...

У CS есть ниша, где он силен, но считать его универсальным языком — никак кроме ограниченности кругозора назвать не могу.

есть 2 варианта 1) ты знаешь основы СS 2) не знаешь
тогда для 1) никогда не возникнет желание учить с++
для 2) надо стать 1)

вопросы?


я думаю, что принципиальная ошибка — это учить с++.

Любопытно услышать ваш рецепт

я думаю, что принципиальная ошибка — это учить с++.

С вот этой строчкой:
while (*p) *q++ = *p++;
Это классический пример копирования строк.
прокомментируем слегка:
while (*p) // < — Здесь следует помнить, что условия в for, while, if, условном операторе?: это — фактически булевый тип, к которому неявно могут приводится другие типы
// Также язык считает ложным значением 0, соотвественно ненулевое значение это истина
// данный код, вероятно, оперирует указателями. p — указатель, *p — значение объекта на которую указывает указатель p
// То есть данный цикл будет выполнятся до тех пор пока логическое значение объекта на который указывает p — истинно
// сам по себе код while (*p) — бесконечный цикл, так как не происходит изменения значения р. Значение р меняется в теле цикла ниже
*q++ = *p++;
// Тут следует знать, что сначала вычисляется правая часть (до знака =), в соотвествии с таблицей приоритетов операторов
если расписать более явно эту строку:
// правая часть
temp_right_p_value = *p // получить значение объекта на который указывает р
++p // сместить указатель на следующий объект типа р
// левая часть
*q = temp_right_p_value // скопировать временное значение p по адресу q
++q // сместить указатель на следующий объект типа q
в итоге символ из строки р скопирован в строку q, указатели указывают на следующие элементы строк.
Цикл закончится когда значение объекта на который указывает p станет равно 0. Это то, что называется null-terminated C string.
В этом коде, как и большинстве другого кода работающего с указателями применяется арифметика указателей.
Пример:
адреса данные
0×00 a
0×01 b
0×02 c
0×03 d
0×04 e
0×05 f
0×06 g
0×07 h
0×08 j
0×09 k
0x... — это формат для шестнадцатиричной системы счисления в С++/C
char *p = 0; данный указатель указывает на объект в памяти по адресу 0×00. Объект хранит значение ’а’
sizeof (char) == 1 // размер типа сhar равен одному байту
p++ сместит указатель на размер типа, и значение указателя будет равно 0×01, а указывать он будет на значение ’b’
p += 3 сместит указатель на длину трех объектов типа char и значение p = 0×04, указывает на ’e’
в случае если:
int *p = 0; p — указатель на тип int и размер int == 4
p++; значение p стало 0×04
p += 3; // p равно 0×10 == 16
p -= 2; // p равно 0×08 == 8
Вообще, код while (*p) *q++ = *p++; может копировать любую последовательность типов, при условии, что тип p можно привести к логическому типу.
Не надо учить С, а потом переучиваться. Сам Страуструп считал недостатком С++ то, что он частично основан на синтаксисе С.
Азы языка можно освоить используюя любую книгу в стиле «С++ для начинающих». Указатели считаются довольно сложной темой для изучения.
По мере продвижения можно начинать Липпмана, Александреску. Мне как-то очень понравилась книга: Ален И. Голуб — Правила программирования на Си и Си++.

Удачи.

Я по Страуструпу учил, но к тому времени относительно хорошо владел С. К тому времени я уже не видел большой разницы между С и С++: все новшества логически вписываются, ведь инкапсуляция, полиморфизм, наследование и прочее уже давно использовались в С, просто требовали определенных паттернов. И Страуструп шел как по маслу (даже перечитывать не надо было).

Я бы рекомендовал выучить С, а потом переучиться. (С переучиванием могут быть проблемы, но если понимать отличия и достоинства процедурного, структурного и ООП, будет несложно).

панове
я в вашому вици памятаю на уроках информатыки був 3 разы за рик.
памятаю урок информатыкы, а мы мымо школы чешемо до анапольського за драпом.
я в инстытут поступыв навить не знав як мышка працюе.

Я вы тут я бачу уже страуструпа читаетэ, Навищо вы поперед батька в пекло?

Герберт Шилдт, Самоучитель С++
Да, и на тот момент я знал С, Асемблер, немного ООП, и много математики... и схемотехники... и кое что про алгоритмы и структуры данных... и вообще про теорию информации...

Ещё хвалят книжку Стенли Липмана. Говорят самая-самая для начинающих.

< andy_iaa> ВЕЛЛЛЛЛЛИИИИКЕ СПААААССССИБББІІІІ за відповідь. Ви нам дуже допомогли. Ще б з літературою оприділитися... Допоможіть ПОЖАЛУСТА.

Дууууууже дякую!!! А мені цікаво, andy_iaa по якій книжці ви починали вчити С++?

Скажіть будь-ласка...

а я отвечу.
указатель это адрес в памяти.
++ это увеличить на 1
p++ это инкремент, т.е. для указателя — записать в p следуюущую ячейку (за той, которая была). (Причем результат выражения будет старое значение)
*p это разыименовать указатель, т.е. взять значение, записаное в адресе
* (p++) это две операции: инкремент и разыменование. Так как (пост) инкремент возвращает старое значение, то результатом будет число, которое было по адресу содержащемуся в p (до инкремента)

*q++ = *p++ это короткая запись, то же самое что *q = *p; p++; q++;. Результат будет значание записанное в q. То есть совместно с while () операция будет продолжаться пока не встретится ’0’.

< anonimus_expertus> Дякуємо за розуміння і пояснення. А з якої би ви нам порадили книжки починати вивчення С++?

Ой свят, свят, свят

В упор неможу поняти як це працює!

Воно копіює сішну стрічку, посимвольно, від першого символа і до кінця

і чо умова (*р)? що це значить?

А то і значить «поки стічка на скінчилась»

Хочеш деталей — прочитай про вказівники... і про стрічки

А з чого нам потрібно було починати вивчення С++?

Вам — однозначно не зі Страуструпа. то складна книжка, яку написав науковець в прнципі для тих хто вже знає С, я її читав вже непогано знаючи С++ і маючи деякий практичний досвід.
Знайдіть просту книжку. Проста книжка — то така яку ви зрозумієте.

І ще одне, вам тут хтось радив сконцентрувати сврї зусилля на матиматиці, фізиці, і мові... ото була дуже слушна порада!

gonzo давайте щоб ви приблизно знали наш рівень — дайте завдення на С++ не сильно важке, але щоб потрібно було подумати, і ми з Сашкою, виконаєм його окремо, так ви будете знати рівень кожного з нас... Якщо ви Хотіли б нам допомогти...

< Point> що ви маєте на увазі? А з чого нам потрібно було починати вивчення С++?

Панове. Ви не с того начали. Для начала нужно читать правила дорожного двіженія. Там обьясняється шо то таке.

gonzo — А чому

Тільки налаштуєте всіх проти себе.

Вам що настільки важко пояснити це поки ми не скачаєм хорошої літератури... На данний момент качаєм ті які ви порадили раніше...Тільки, но знайшли... Просим Вибачення за те що приносим вам проблеми!

Але якщо ви так хочете ми можемо з Вашого форума ступитись...

Я зроблю табличку тільки якщо пойму що на що тут вказує:

while (*p) *q++ = *p++; —
*q = 0; —

і чо умова (*р)? що це значить?

Вы просто только начинаете, и мозг не привык мыслить алгоритмами еще, это прийдет с опытом. Я когда в школе занимался часто рисовал табличку в которой прослеживал изменения переменных и участков памяти на каждой итерации цыкла. Попробуй сделать такое, выложи сюда, а мы укажем на ошибки.

< Димон> Просто в мене інтернет повільний і багато літератури нема, є тільки Бьярн Страустрап, а він тяжкий для вивчення без допомоги. Вот я і прошу про допомогу.

Дякую, але ж все одно б хотілося зрозуміти ЯК це працює...

Прекращайте заниматься ерундой! Возьми и прочти хоть какую-то базу! Про алгоритмы и структуры данных уже сказано-пересказано... Кроме этого скромного набора, возьмите и почитайте хоть что-то об архитектуре...

И еще: ты всерьез полагаешь, что сможешь хоть чему-то научиться, задавая по каждому пустяку вопросы на форуме?

2crypto5

Лучше их не использовать; -)

+100

а як їх можна не використовувати? чим замінити?

Умные указатели через темплейты, ссылки, статические масивы и переменные и куча других подходов... народ же пишет на Java, C# итд без них;) значит это возможно

Я вивчаю С++ з Андрієм.

while (*p) *q++ = *p++;
*q = 0;
—: -) —
while (*q++ = *p++);
—<: -) —
В упор неможу поняти як це працює!

Поможіть будь-ласка!

< crypto5>, а як їх можна не використовувати? чим замінити?

Бьярн Страустрап дойшов до функцій.Читали дуже уважно.По декілька раз.

Лучше их не использовать; -)

хм, вопрос класса, я учусь водить, но не знаю как правильно пользоваться переключателем деференциала...

наверное стоит конкретезировать в чем именно проблема?

Скільки сторінок книг, що вам порекомендували, ви уважно прочитали?

Підписатись на коментарі