LINUX.ORG.RU

Кто глючит: я или gcc?


0

0

gcc 3.3.4

Тестовая программа из двух файлов:

#cat main.c

int main()
{
        print_msg("russian");
        print_msg("english");
        return 0;
}

#cat print_msg.c

void print_msg(char * msg_type)
{
        printf("%s\n", msg_type == "russian" ? "RUS" : "ENG");
}

#cc main.c print_msg.c
#./a.out
ENG
ENG

#cc -O2 main.c print_msg.c
#./a.out
RUS
ENG

Ничего не понимаю. 
Почему оптимизация так dramatically влияет на выполнение программы?
anonymous

глючишь ты , тебе не кажется некоректным сравнение вида msg_type == "russian" ???

anonymous
()
Ответ на: комментарий от anonymous

А что такого? Всегда так пишу. В скобки разве заключить надо? И почему тогда с -O2 работает?

anonymous
()
Ответ на: комментарий от anonymous

man strcmp

Хотя нет, при такой степени запущенности не поможет. Найди себе что ли книжку, что-нибудь типа "C для чайников"...

int19h ★★★★
()

может выучишь язык C перед тем как что-либо писать на нем?

msg_type == "russian"

сравнивает указатели на строки, но не сами строки.

fghj ★★★★★
()

Потому что компилятор соптимизировал строковые константы.

А сравнение действительно некорректное, man strcmp

Без оптимизации "russian" оказывались двумя строчками по разным адресам.

anonymous
()

>Почему оптимизация так dramatically влияет на выполнение программы?

Может быть при оптимизации одинаковые строки разместились одинаково, а без оптимизации у тебя в памяти - три строки.

C не дает гарантий, что одинаковые строковые константы лежат по одному адресу (насколько я помню, при определенных условиях Java дает, т.е. в ней подобный код был бы корректен).

Murr ★★
()
Ответ на: комментарий от Murr

> при определенных условиях Java дает, т.е. в ней подобный код был бы корректен

AFAIK в Яве две одинаковые строковые _константы_ дают true при сравнении через ==. Но за такое все равно полагается убивать =)

int19h ★★★★
()
Ответ на: комментарий от int19h

Скажем так, это не совсем правильный стиль программирования. ;)

К тому же при определенных условиях это нарушается (по-моему, если строки в разных пакетах объявлены).

Murr ★★
()
Ответ на: комментарий от Murr

Это уже оффтоп, но все равно залез на сайт Sun:

У них так написано:

# Literal strings within the same class (§8) in the same package (§7) represent references to the same String object (§4.3.1).
# Literal strings within different classes in the same package represent references to the same String object.
# Literal strings within different classes in different packages likewise represent references to the same String object.
# Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
# Strings computed at run time are newly created and therefore distinct.
# The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents.

Murr ★★
()
Ответ на: комментарий от fghj

>сравнивает указатели на строки, но не сами строки.

Ну а если разименовать указатель?

(&msg_type == "russian") ?

Про strcmp в книжке читал, но не думал что когда-нибудь пригодятся все эти malloc(), strcmp(), strcpy() ...

anonymous
()
Ответ на: комментарий от anonymous

>Да, и еще: какая разница между

Никакой.

Murr ★★
()
Ответ на: комментарий от anonymous

anonymous (*) (08.03.2005 14:29:49):

>Ну а если разименовать указатель? (&msg_type == "russian") ?

Тебе уже ответили -- почитай что-нибудь.

Если уже почитал, и не помогло -- бросай это дело. Серьезно. Видимо, тип интеллекта не позволит тебе заняться программированием.

Это не накат. Просто так бывает -- например, я бы не взялся профессиональному пианисту объяснять, скажем, проблему асимптотической свободы в квантовой хромодинамике.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Да, читал... В книжке сказано, что пойнтеры - это самое сложное в написании кода.

А про тип мышления ты оченб даже прав, к математике способностей нет, а писать на C++ хочется!

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (08.03.2005 14:53:04):

> а писать на C++ хочется!

Тогда подсказка: твой код написан на C, а не на C++! Ты, видимо, думаешь про него, как про C++ -ный код...

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

>Ну а если разименовать указатель?
>(&msg_type == "russian") ?

ты анонимус конечно извини, но я думаю ты тяжёлыми наркотиками долбишься...теж сказали почитай книжки...

golodranez ★★★★
()
Ответ на: комментарий от Die-Hard

>Тогда подсказка: твой код написан на C, а не на C++! Ты, видимо, думаешь про него, как про C++ -ный код...

В том то и проблема, что начинающие программеры не видят разницы между С и С++.

Автору: прочитай K&R http://lib.ru/CTOTOR/kernigan.txt

human0id ★★★
()
Ответ на: комментарий от anonymous

Очень тебя прошу - не пиши. Ни на C++, ни на чём либо ещё.

vsl
()
Ответ на: комментарий от human0id

> В том то и проблема, что начинающие программеры не видят разницы между С и С++.

Вот кстати, меня давно мучал один вопрос... все книжки, которые я видел по C++, почему-то начинаются с введения именно в C. Т.е. указатели, printf, malloc, все дела... Потом идет что-то в духе "а вот C++ - это как C, только с классами". Правда, у Страуструпа не так - но там книжка не особо легко читается, явно не для незнакомых с предметом. Отсюда и получаем "программистов" на C++, реально пишуших на "C с классами". А вот нет ли какой-нибудь _нормальной_ книги по плюсам - чтоб начиналось с vector, string, и iostream, и далее про объектную модель, шаблоны, и идеологию STL, а про, скажем, адресную арифметику только поверхностно и матюками? =)

int19h ★★★★
()
Ответ на: комментарий от int19h

Die-hard, да, я знаю, что это не C++, это я про C++ просто так упомянул, а этот пример - это меня приятель спросил, как программы из нескольких файлов вручную компилировать, ну вот я для примера написал крохотную тестовую программку.

>все книжки, которые я видел по C++, почему-то начинаются с введения именно в C.

Аналогично, а видел я их целых адын :)

>vector, string, и iostream, и далее про объектную модель, шаблоны, и идеологию STL

Из всего этого прочитал и реально использовал только шаблоны :(

anonymous
()
Ответ на: комментарий от int19h

Дык, парадокс: дабы нормально писать на C++, надо сначала выучить Scheme (заради гигиены), Python и Java. Ещё, желательно, Common Lisp (CLOS), Eiffel и Smalltalk. Си - лучше временно вообще забыть. Изучать C++ без знания этих языков - самоубивство.

vsl
()
Ответ на: комментарий от vsl

>Дык, парадокс: дабы нормально писать на C++, надо сначала выучить Scheme (заради гигиены), Python и Java. Ещё, желательно, Common Lisp (CLOS), Eiffel и Smalltalk. Си - лучше временно вообще забыть. Изучать C++ без знания этих языков - самоубивство.

помоему ты прав только в том, что про Си лучше забыть....

golodranez ★★★★
()
Ответ на: комментарий от golodranez

Ну так откуда ты другие знания возьмёшь? В C++ все эти концепции реализованы очень криво, и новичёк, не знакомый с ними заранее, их просто не заметит или не поймёт.

Кстати, дабы иметь мнение по этому поводу, ты должен быть хорошо знаком со всеми обсуждаемыми языками. Иначе твоё "помоему" никого интересовать не будет.

vsl
()
Ответ на: комментарий от anonymous

>Ну а если разименовать указатель?
>
>(&msg_type == "russian") ?

насколько я знаю разыменовывают указатели вот так: *msg_type

а так берут адрес ячейки памяти где лежит указатель: &mst_type

в любом случае в таком случае ты будешь сравнивать разные типа.

для того чтобы сравниться строки надо сравнить почти все символы в них,
для этого strcmp и предназначена

fghj ★★★★★
()
Ответ на: комментарий от vsl

>Дык, парадокс: дабы нормально писать на C++, надо сначала выучить Scheme (заради гигиены), Python и Java. Ещё, желательно, Common Lisp (CLOS), Eiffel и Smalltalk. Си - лучше временно вообще забыть. Изучать C++ без знания этих языков - самоубивство.

;)))

Вот как раз если сунуться в C++ с Java-подходом и будет выходить код типа вышеприведенного... ;)))

По моему у Айры Пола есть серия книг типа "C++ для С-программистов" Ну и так далее ...

Нужно чётко понимать что C !=C++ с точки зрения дизайна (как и Java != C++)

C++ это мощнейший гибрид (от макроассемблера до метаязыка в одном флаконе) но этим гибридом нужно пользоваться очень осторожно...

Зато если ты сможешь освоиться с его "многоуровневостью" скорость разработки возрастает в разы ...

Ну а знание других парадигм конечно полезно ... но мало кто этим серьёзно занимается ... обычно в человек выбирает некий свой "уровень" в C++ и в нем работает ... всё определяется предметной областью в данном случае.

Главное чтобы хватило ума использовать в конкретных случаях адекватные инструменты ... а для этого желательно знание этого самого инструмента чего в данном конкретном случае не наблюдается.

sS ★★★★★
()
Ответ на: комментарий от vsl

>Ну так откуда ты другие знания возьмёшь? В C++ все эти концепции реализованы очень криво, и новичёк, не знакомый с ними заранее, их просто не заметит или не поймёт.

Вот как раз новичку сильно не рекомендуется пытаться изучить один язык через другой (пусть там даже концепция "прямее" реализована) Иначе новичёк из за нехватки знаний начинает искать что ? Правильно, аналогии, чего делать новичку не следует. Начало этой ветки как раз хороший пример этого.

sS ★★★★★
()
Ответ на: комментарий от int19h

>А вот нет ли какой-нибудь _нормальной_ книги по плюсам - чтоб начиналось с vector, string, и iostream, и далее про объектную модель, шаблоны, и идеологию STL, а про, скажем, адресную арифметику только поверхностно и матюками? =)

Недавно Die-Hard здесь ссылку кидал, C++ Anotation кажется книжка называется. Там априори подразумевалось знание Сей у читателя.

human0id ★★★
()
Ответ на: комментарий от human0id

human0id:

> Недавно Die-Hard здесь ссылку кидал, C++ Anotation...

http://www.icce.rug.nl/documents/cplusplus

Единственная разумная (из известных мне) книга по ЦеПП.

> Там априори подразумевалось знание Сей у читателя.

А она не для "носорогов".

Кто бы что бы не говорил, я если кто-то не знает Це, то программировать он не умеет: слишком много первоисточников закодировано на нем. Можно не программировать на Це, но понимать синтаксис -- обязательно.

Точно так же без знания английского невозможно быть IT специалистом (можно не говорить на нем, но хоть немного читать -- обязательно).

Die-Hard ★★★★★
()
Ответ на: комментарий от vsl

> Дык, парадокс: дабы нормально писать на C++, надо сначала выучить Scheme (заради гигиены), Python и Java. Ещё, желательно, Common Lisp (CLOS), Eiffel и Smalltalk. Си - лучше временно вообще забыть. Изучать C++ без знания этих языков - самоубивство.

Имхо, ты не прав. _Можно_ изучить C++ и понять его философию, не зная ничего из вышеприведенного - говорю по собственному опыту =) впрочем, поправлюсь: Scheme я не знаю, про Lisp вот только недавно сел читать. Но вот Python/Java/Eiffel - ковырял. Причем _после_ C++.

Другой вопрос, что на то, чтобы действительно изучить плюсы, уходит не один год. В том числе и по причине отсутствия "правильной" литературы на тему.

int19h ★★★★
()
Ответ на: комментарий от human0id

> Недавно Die-Hard здесь ссылку кидал, C++ Anotation кажется книжка называется. Там априори подразумевалось знание Сей у читателя.

А вот мне как раз не надо, чтоб подразумевалось знание C. Оно должно начинаться с таких вещей, как типы и операторы, но _не углубляясь_ в низкоуровневую специфику C - адресная арифметика, malloc/free, strcpy со товарищи, printf etc. Т.е. с самого начала все на STL.

int19h ★★★★
()
Ответ на: комментарий от Die-Hard

> Кто бы что бы не говорил, я если кто-то не знает Це, то программировать он не умеет: слишком много первоисточников закодировано на нем. Можно не программировать на Це, но понимать синтаксис -- обязательно.

Из этого, однако, не следует, что C нужно изучать до C++, как обычно делают. Имхо это оказывает чрезмерно деструктивное воздействие на образ мышления изучающего =/

int19h ★★★★
()
Ответ на: комментарий от int19h

>А вот нет ли какой-нибудь _нормальной_ книги по плюсам - чтоб начиналось с vector, string, и iostream, и далее про объектную модель, шаблоны, и идеологию STL, а про, скажем, адресную арифметику только поверхностно и матюками? =)

Э така кнiга, i вона маэ назву "С++ для початкiвцiв" Лiпмана.

http://netron.net76.ru/modules/books/files/lippman.zip

anonymous
()
Ответ на: комментарий от int19h

Ну, если *годы* - то хоть и вовсе без книг и примеров кода, сам всю философию освоишь. Я же говорю о том, как быстрее и надёжнее всего. За пару месяцев в сумме.

vsl
()
Ответ на: комментарий от vsl

> Ну, если *годы* - то хоть и вовсе без книг и примеров кода, сам всю философию освоишь.

Без книг и кода - это как? По стандарту? ;)

> За пару месяцев в сумме.

Scheme, Python, Java, Eiffel, Smalltalk и C++ - все за пару месяцев? Не слишком ли круто? Не думаю, что от такого обучения будет много толку...

int19h ★★★★
()
Ответ на: комментарий от anonymous

> кажется здесь С присутствует только в конце первой главы, в разрезе: "а вот то, что мы изучили, на С делается через ... и .... А теперь и впредь С++"

Судя по оглавлению, там не особо много уделяется шаблонам - которые, имхо, есть основная фича языка. Вообще, вот еще один общий недостаток таких книг: они слишком фокусируются на самом языке, забывая про STL (кроме, разве что, строк и потоков) - и очень зря, потому что именно в STL вся мощь плюсов, и у нее тоже есть своя философия. Которую нужно знать для эффективного ее применения.

int19h ★★★★
()
Ответ на: комментарий от int19h

Тормознул. Код нужен. Плохой. Пионэрами писаный. Дабы из него стандарт языка восстановить. Вот на это годы уйдут. Иначе - фигня.

И пары месяцев full time - вполне достаточно на всё вышеперечисленное, с нуля. Не вижу причин, почему бы это было не так.

vsl
()
Ответ на: комментарий от int19h

int19h:

> не следует, что C нужно изучать до C++, как обычно делают. Имхо это оказывает чрезмерно деструктивное воздействие на образ мышления изучающего =/

Все же, вставлю реплику:

IMHO все равно, в какой последовательности изучать Це и ЦеПП.

Главное -- не надо начинать ни с того, ни с другого. Оба слишком "кишками наружу", чтобы юное существо уловило инварианты, стоящие за предоставляемыми этими языками возможностями поиздеваться над компьютером.

Хотя бывают исключения...

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> IMHO все равно, в какой последовательности изучать Це и ЦеПП.

Имхо все же нет, и вот почему. Если бы C и C++ были совершенно разными языками - проблемы бы не было. Но на плюсах можно при желании легко писать "как на C", иногда разбавляя это дело классами и прочими плюсовыми фичами - и вот именно это чаще всего и делают люди, обученные сначала C, а потом дорвавшиеся до C++.

> Главное -- не надо начинать ни с того, ни с другого. Оба слишком "кишками наружу", чтобы юное существо уловило инварианты, стоящие за предоставляемыми этими языками возможностями поиздеваться над компьютером.

Это однозначно =) Первым языком имхо должен быть либо Scheme, либо Smalltalk.

int19h ★★★★
()
Ответ на: комментарий от vsl

> И пары месяцев full time - вполне достаточно на всё вышеперечисленное, с нуля. Не вижу причин, почему бы это было не так.

А я - не вижу примеров подобного. Зато вижу массу обратных примеров.

И еще. За пару дней можно, при определенных навыках (НЕ с нуля) "пробежаться" по описанию языка и понять его на уровне написания не слишком сложных вещей. Но чтобы действительно _изучить_ язык, нужно на нем писать. Много. И вот это ты в два месяца никак не втиснешь.

Или ты, приводя свой список, имел в виду именно ознакомление с идеями этих языков и их философией и семантикой, с чисто образовательными целями?

int19h ★★★★
()
Ответ на: комментарий от int19h

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

vsl
()
Ответ на: комментарий от vsl

On Thu, 2005-03-10 at 14:23 +0300, vsl wrote:
> Я имел в виду по одному мелкому тренировочному проекту (на недельку)
> для каждого языка. Дабы усвоить именно концепции, но не успеть
> погрязнуть в деталях.

Угу, а литературу читать когда?

Имхо ты переоцениваешь силы среднего начинающего программиста. Да, я
знаю, после десятого языка все прочие "проглатываются" очень быстро, по
принципу "это как в Scheme ... это как в Smalltalk ... etc". Но поначалу
идет со скрипом.

Вообще имхо стоило бы сначала давать один язык, но такой, чтобы сразу
привить хорошие манеры =) Скажем, Scheme - красивая, прозрачная,
понятная вещь. И на нем обкатывать базовые понятия и алгоритмы. А потом
уже полноценная подборка языков с разными идеологиями - ООП, ФП etc.

int19h ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.