Вопросы по учебнику С... (Плавно из одного вопроса получилось несколько)

Модератор: Модераторы разделов

Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

(deninok) писал(а):Ещё более странный вопрос. Могу лишь сказать, что некоторые положения из стандарта С++ были добавлены в последний стандарт С (С99). Например, поддержка комментариев //.

ну а причёт тут C++ то ?

вот даже NULL, в C это (void *) 0 а в C++ это 0
если в C++ это ноль, это никак не делает NULL в C просто нулём, т.к. это полностью меняет смысл выражения
новый стандарт не меняет старого, только если его переутвердят, компилятор может поддерживать все стандарты на момент своего выпуска, а пока он существует может выйти новая версия стандарта языка для которого он написан, он обязан только соответствовать той версии стандарта языка, для которого он написан, которая была на тот момент когда он был написан (все которые были на тот момент) и не должен отменять ни одну из предыдущих версий стандарта
то есть если есть компиляторы написанные после 89 года, то они все должны поддерживать ANSI, если написаны после 99 года, то они все должны поддерживать 99, соответственно любой который написан после 99 написан и после 89, любой который поддерживает 99 обязательно включает в себя и ANSI
если я пишу на ANSI там есть некоторые моменты, которые противоречат 99, компилятор не знает на каком я пишу на ANSI или на 99 и выдаёт предупреждение, т.е. если он выдаёт предупреждение это ещё не значит что там ошибка, потому и определения функций типа
void f(a, b, c) int a; int b; int c; {
}
не будут ошибкой, потому что это ещё древнее ANSI, т.е. это противоречит ANSI, т.к. там принято другое, но ошибки в объявлении локальных переменных там нет, void'а там не было он соответсвует ANSI, определения переменных в ANSI новые, а компилятор поддерживает и старые (возможно он их переведёт как новые), но старый вид определения локальных переменных не отменяется, пока старый вид (он вроде не был стандартизован даже) где-нибудь может применяться он должен поддерживаться компиляторами для C
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: Вопросы по учебнику С...

Сообщение кодировщик »

Folderx писал(а):
21.12.2008 22:55
вот даже NULL, в C это (void *) 0 а в C++ это 0
если в C++ это ноль, это никак не делает NULL в C просто нулём, т.к. это полностью меняет смысл выражения

а что разве NULL когда-то чему-то равнялся?! :rolleyes:
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вопросы по учебнику С...

Сообщение AestheteAnimus »

кодировщик писал(а):
21.12.2008 23:32
а что разве NULL когда-то чему-то равнялся?! :rolleyes:

Александреску, например, пишет 0 безо всякого зазрения.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

(Folderx) писал(а):
(deninok) писал(а):Ещё более странный вопрос. Могу лишь сказать, что некоторые положения из стандарта С++ были добавлены в последний стандарт С (С99). Например, поддержка комментариев //.

ну а причёт тут C++ то ?

При том, что в С до этого были только комментарии вида /* */.

(Folderx) писал(а):вот даже NULL, в C это (void *) 0 а в C++ это 0

Ну, есть ещё и вариант (char*)0.
А вообще, использование NULL в С++ крайне не рекомендуется. Если вам нужно обнулить указатель, присвойте ему просто 0.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

(deninok) писал(а):При том, что в С до этого были только комментарии вида /* */.

так они такие и остались, в стандарте ANSI их нет

(deninok) писал(а):А вообще, использование NULL в С++ крайне не рекомендуется.

NULL - просто макроопределение, для C++ оно переопределяется в простой 0

а как там происходит дело, когда в указатель помещается число 0 ? ведь это разные типы, в C++ он приводится к типу адреса ячейки или как ? или напрямую нулевая ячейка по счёту ? как это там реализовано ?
числа и адресы - это ж разные вещи
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Вопросы по учебнику С...

Сообщение Женя Подсыпальников »

NULL в С++ - яко соль на кухне:

мы слышим NULL и подразумеваем указатель,
мы держим указатель и проверяем его на NULL... :)

Для переменных иного типа - есть другие предпочтения,
например: FALSE (false) для BOOL (bool) :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

deninok писал(а):
22.12.2008 11:07
А вообще, использование NULL в С++ крайне не рекомендуется. Если вам нужно обнулить указатель, присвойте ему просто 0.
почему?
и в чём таки разница? (именно в С++, про разницу в С я знаю)

Folderx писал(а):
22.12.2008 11:45
а как там происходит дело, когда в указатель помещается число 0 ?
разве 0 в С++ это число?

в
int *ptr = 0;
разве происходит преобразование int => int* ?

а в
int *ptr;
*ptr = 0;
?

Женя Подсыпальников писал(а):
22.12.2008 16:38
Для переменных иного типа - есть другие предпочтения,
например: FALSE (false) для BOOL (bool)
терпеть их немогу.
if(function() == TRUE)...вот и приехали, здравствуй, дебагер!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вопросы по учебнику С...

Сообщение AestheteAnimus »

drBatty писал(а):
22.12.2008 22:56
терпеть их немогу.
if(function() == TRUE)...вот и приехали, здравствуй, дебагер!

Где же Вы такой замечательный код видели?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

AestheteAnimus писал(а):
23.12.2008 00:25
Где же Вы такой замечательный код видели?
новички постоянно так пишут... ещё обижаются, говорят if(function()) не настолько понятно...
поверьте, я это не придумал.

PS: начинаешь объяснять - говорят: зачем же тогда в языке есть bool true false?
Ответить собственно нечего...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

drBatty писал(а):
22.12.2008 22:56
deninok писал(а):
22.12.2008 11:07
А вообще, использование NULL в С++ крайне не рекомендуется. Если вам нужно обнулить указатель, присвойте ему просто 0.
почему?
и в чём таки разница? (именно в С++, про разницу в С я знаю)

Рекомендация Страуструпа. И не только его...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

deninok писал(а):
23.12.2008 09:06
Рекомендация Страуструпа. И не только его...
Он(и не только он) обычно как-то объяснял свои рекомендации...
а не так, как Вы...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

почему же функции то одинаково называются у них там main и там main
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Вопросы по учебнику С...

Сообщение Женя Подсыпальников »

drBatty писал(а):
22.12.2008 22:56
if(function() == TRUE)...вот и приехали, здравствуй, дебагер!


Тут есть какая-то тревога ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

Женя Подсыпальников писал(а):
23.12.2008 09:29
Тут есть какая-то тревога ?
ну просто TRUE это не FALSE, т.е. не ноль.
но запись ==TRUE вовсе не означает !=FALSE, как ожидается...

Беда в том, что сколько бы теоретики не спорили, ни в С ни в С++ как не было булевого типа, так и нет, и не будет. А то, что есть приводит к глюкам и багам.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Вопросы по учебнику С...

Сообщение Женя Подсыпальников »

drBatty писал(а):
24.12.2008 03:50
но запись ==TRUE вовсе не означает !=FALSE, как ожидается...


Коли ожидается не то, что заказано - всегда тяжко... :)

Говорят, что это механизм многих человеческих обид... :D
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

Женя Подсыпальников писал(а):
24.12.2008 09:38
Коли ожидается не то, что заказано - всегда тяжко...
Говорят, что это механизм многих человеческих обид...
ага. потому косо посмотрел на попытки введения всех этих типов, и как писал if(x), так и буду писать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вопросы по учебнику С...

Сообщение AestheteAnimus »

В С99 есть булев тип (см. stdbool.h). А вообще беда в другом, а именно в том, что Си пытаются понять паскалевскими категориями, где-то особый булев тип ищут (который был бы сам по себе), а потом еще удивляются, почему это не работает, так как работало в других языках.

Какие споры теоретиков? Если выражение отлично от нуля, то оно истинно, точка! А чтобы не ожидать чего-то непонятного, нужно просто внимательно читать стандарт, а не выдумывать всяких интуитивных конструкций.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

drBatty писал(а):
23.12.2008 09:08
deninok писал(а):
23.12.2008 09:06
Рекомендация Страуструпа. И не только его...
Он(и не только он) обычно как-то объяснял свои рекомендации...
а не так, как Вы...

Прошу прощения. Исправляюсь немедленно.

Вот выдержка из книги Стефана Дьюхерста "Скользкие места С++", стр.34:

Было время, когда программа на С++ могла "рухнуть", если для представления нулевого указателя использовался символ препроцессора NULL. Проблема в том, что NULL определяется по-разному на разных платформах:

Код: Выделить всё

#define NULL ((char*)0)
#define NULL ((void*)0)
#define NULL 0
Из-за этого переносимость программ на С++ оказывалась под угрозой:

Код: Выделить всё

f( NULL );   // зависит от платформы, неоднозначно
На самом деле, непосредственно представить нулевой указатель в С++ нельзя, но гарантируется, что числовой литерал 0 можно преобразовать в нулевой указатель любого типа. Именно так программисты на С++ обеспечивают переносимость и корректность своего кода. В стандарте сказано, что определения типа (void*)0 недопустимы, так что технических проблем с использованием NULL не возникнет (правда, сам факт того, что это символ препроцессора заставляет относится к нему с подозрением). Тем не менее, настоящие программисты на С++ по прежнему представляют нулевой указатель литералом 0. Применяя любой другой способ, вы рискуете показаться безнадёжно старомодным.


P.S. К счастью, с выходом ожидаемого стандарта С++09 проблема представления нулевого указателя наконец-то исчезнет. Дело в том, что для этой цели добавлено новое ключевое слово nullptr.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

AestheteAnimus писал(а):
24.12.2008 11:22
В С99 есть булев тип
нету. я думаю вы и сами это понимаете ;)
учитывая то, что,
AestheteAnimus писал(а):
24.12.2008 11:22
пытаются понять паскалевскими категориями, где-то особый булев тип ищут (который был бы сам по себе)
ИМХО либо особый тип, либо никакого. Лично я считаю что никакого нет, в стандарте новые ключевые слова появились, а типа не появилось. Потому и не надо этими словами пользоваться, так-как С это именно С.
AestheteAnimus писал(а):
24.12.2008 11:22
Если выражение отлично от нуля, то оно истинно, точка! А чтобы не ожидать чего-то непонятного, нужно просто внимательно читать стандарт, а не выдумывать всяких интуитивных конструкций.
я и не спорю :) Если целое выражение отлично от нуля... double оно на практике всегда отлично от нуля, если только это не константа 0.0, указатель тоже, если конечно это не особый указатель равный NULL. Только для целых чисел появление 0 - обычное дело, для всех остальных чисел это особый случай, и на практке этого не происходит. Мог бы быть ещё один тип, булевый, но его нет...

deninok писал(а):
25.12.2008 09:06
f( NULL ); // зависит от платформы, неоднозначно
не понимаю, почему это зависит от платформы?
если в моей платформе NULL это 0, то у меня это будет работать.
в Вашей платформе NULL это ((void*)0x173456), но f(NULL); будет у вас работать точно так-же как и у меня, и так, как ожидается. Смысл вводить nullptr? И так часть пишет 0, другая NULL, что, появится третья часть кодеров пишущих nullptr? И это будет совсем хорошо!
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

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

это уже сделано как раз вот этот NULL и выведен он в препроцессор, потому что язык менять не нужно чтобы полностью поменять смысл указателей, переписал хедеры и всё
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

(drBatty) писал(а):
(deninok) писал(а):f( NULL ); // зависит от платформы, неоднозначно
не понимаю, почему это зависит от платформы?

Вопрос к Дьюхерсту... :) Лично я доверяю этому пионеру С++ (имеющему, в том числе, многолетний опыт разработки компиляторов), и поэтому просто следую его рекомендации.

(drBatty) писал(а):Смысл вводить nullptr? И так часть пишет 0, другая NULL, что, появится третья часть кодеров пишущих nullptr? И это будет совсем хорошо!

Вот именно для того, чтобы больше не было такой ситуации, когда одна часть пишет 0, а другая NULL, и вводится единое ключевое слово. Стандартизация...

(Folderx) писал(а):это уже сделано как раз вот этот NULL и выведен он в препроцессор...

Именно потому, что NULL - препроцессорный макрос, его использование нежелательно. При использовании стандартного С++ применение препроцессора (в идеале) должно свестись только к двум функциям: включение заголовочников и их защита от множественного включения.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

(deninok) писал(а):Именно потому, что NULL - препроцессорный макрос, его использование нежелательно.

из-за чего ?
препроцессорные макросы обеспечивают переносимость
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

(Folderx) писал(а):из-за чего ?

Из-за того, что препроцессор не знает С++.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

препроцессор опирается на хедеры

(deninok) писал(а):применение препроцессора (в идеале) должно свестись только к двум функциям: включение заголовочников и их защита от множественного включения

а это почему ?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

deninok писал(а):
25.12.2008 11:58
Лично я доверяю этому пионеру
а я - нет. потому что всю главу надо прочитать, почему в этом случае возникает неоднозначность.
deninok писал(а):
25.12.2008 11:58
Стандартизация...
ага. читал тут обсуждение на вике, "как писать слово хеш/хэш". Вот им и предложите, писать хаш, что-бы не было разногласий, да и и слово английское, больше похоже на hash.

deninok писал(а):
25.12.2008 11:58
Именно потому, что NULL - препроцессорный макрос, его использование нежелательно.
ну-ну... что-то я сомневаюсь, что все компиляторы, особенно для не самых топовых железок будут поддерживать ваши новые словечки ;) Предлагаете в этих случаях использовать ёлочки из #ifdef ???Не проще ли просто один NULL определить?
deninok писал(а):
25.12.2008 14:13
Из-за того, что препроцессор не знает С++.
этими новыми словами вы усложняете и так не самый простой язык...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вопросы по учебнику С...

Сообщение AestheteAnimus »

drBatty писал(а):
25.12.2008 10:12
AestheteAnimus писал(а):
24.12.2008 11:22
В С99 есть булев тип
нету. я думаю вы и сами это понимаете ;)
учитывая то, что,
AestheteAnimus писал(а):
24.12.2008 11:22
пытаются понять паскалевскими категориями, где-то особый булев тип ищут (который был бы сам по себе)
ИМХО либо особый тип, либо никакого. Лично я считаю что никакого нет, в стандарте новые ключевые слова появились, а типа не появилось. Потому и не надо этими словами пользоваться, так-как С это именно С.

Появился стандартный способ описать булеву переменную. Философию Си я бы озаглавил так: "все число", поэтому совершенно бессмысленно плодить какие-то дополнительные искусственные типы.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Вопросы по учебнику С...

Сообщение deninok »

(drBatty) писал(а):
(deninok) писал(а):Именно потому, что NULL - препроцессорный макрос, его использование нежелательно.
ну-ну... что-то я сомневаюсь, что все компиляторы, особенно для не самых топовых железок будут поддерживать ваши новые словечки ;)

Конечно, не будут! По крайней мере, сразу. Ибо сначала публикуется официальный стандарт, а уже потом разработчики компиляторов приспосабливают их под новый ISO.

(drBatty) писал(а):
(deninok) писал(а):Из-за того, что препроцессор не знает С++.
этими новыми словами вы усложняете и так не самый простой язык...

Ну, во-первых, не я, а Комитет стандартизации С++. :)
А во-вторых, я ничего не имею против новых ключевых слов, если они сделают разработку программ удобнее.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вопросы по учебнику С...

Сообщение drBatty »

AestheteAnimus писал(а):
26.12.2008 05:48
Появился стандартный способ описать булеву переменную. Философию Си я бы озаглавил так: "все число", поэтому совершенно бессмысленно плодить какие-то дополнительные искусственные типы.

конечно! я бы добавил: ...и указатели.
deninok писал(а):
26.12.2008 10:10
А во-вторых, я ничего не имею против новых ключевых слов, если они сделают разработку программ удобнее.
будет путаница и споры "как правильно?"
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: Вопросы по учебнику С...

Сообщение AestheteAnimus »

drBatty писал(а):
26.12.2008 12:17
конечно! я бы добавил: ...и указатели.

Нет, ничего добавлять не надо. Указатели - тоже число.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Вопросы по учебнику С...

Сообщение Folderx »

(deninok) писал(а):я ничего не имею против новых ключевых слов

новые ключевые слова вырождают язык, ну это типа за 10 лет он так ими наводняется, что его становится в два раза труднее учить, все выбирают более простые языки и результат - C#, то есть ты со своими знаниями C++ должен переходить на другой язык и все свои наработки за программистскую жизнь переводить на него, потому что они станут бесполезны
препроцессор был сделан исходя из этих соображений, а не потому что там нужно включать файлы
сейчас можно написать программу для виндовс, благодаря препроцессору, потому что все типы находятся в windows.h, при этом в самом начале, когда сишник только вышел windows не было в планах, а теперь он практически не изменился с тех пор, и всё работает (потому что наводнялись хедеры а не язык)
Спасибо сказали: