| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [C++] "char* s = {'\0'}" |
| Автор: JackYF 16.8.2007, 18:24 | ||
| Итак, мини-квест. Имеем код:
Смотрим и пытаемся предугадать, что сделает этот код. Потом запускаем свой любимый компилятор, загоняем в него код, компилируем, запускаем, материмся про себя, и пытаемся объяснить увиденное. Я вот не смог. |
| Автор: Annihilator 16.8.2007, 18:51 |
| Если компилятор обнаруживает строковый литерал, он сохраняет его в таблице строк программы и генерирует указатель на нужную строку. При выполнении этой проги символы, образующие строковый литерал, сохраняются в таблице строк, а переменной s присваивается указатель на соответствующую строку в этой таблице |
| Автор: zkv 16.8.2007, 19:08 | ||
а где тут строковый литерал? Я вижу только {'\0'}, что эквивалентно {0}, этот пример сработает также:
|
| Автор: jonie 16.8.2007, 19:12 | ||||||
тоже что и
так что в чем проблемы-то? ---------- "тоже" всмысле раскрывания выражений компилятором ессна) |
| Автор: Annihilator 16.8.2007, 19:56 | ||
если напишем вот так
то выдаст NULL, получается мы инициализируем указатель NULL`ом |
| Автор: jonie 16.8.2007, 20:04 | ||
----------------------- кстати нулевой указатель вовсе не обязательно представляется двоичным нулем |
| Автор: MAKCim 16.8.2007, 20:15 | ||||||
смотри
так что {0} = 0 Добавлено через 1 минуту и 22 секунды
не вижу смысла в обратном |
| Автор: bsa 16.8.2007, 21:05 | ||
Боюсь, если какой-то умник сделает его не равным двоичному нулю, то куча прог перестанет работать, так как значение NULL станет истиной в булевых операциях. |
| Автор: MAKCim 16.8.2007, 21:23 | ||
| bsa, я всегда явно проверяю
|
| Автор: bsa 16.8.2007, 21:47 |
| А вот сразу оптимизацией занимаюсь. |
| Автор: nickless 16.8.2007, 21:52 |
| Мдя, а я попробовал на gcc... Я последния раз это слово видел, когда на дельфи программировал |
| Автор: Xenon 16.8.2007, 22:04 |
| Макросы нерулез и кака |
| Автор: jonie 16.8.2007, 22:09 | ||||||||||
вы не поняли смысла моей цитаты. нулевой указатель не обязательно нуль.
в общем читайте FAQ-и : http://faqs.org.ru/progr/c_cpp/cfaqrus.htm |
| Автор: MAKCim 16.8.2007, 22:24 | ||
ты же сам написал if (p) ~ if (p != 0) если NULL != (void*)0, то if (p) = true а это неправильно с учетом семантики NULL Добавлено через 9 минут и 15 секунд jonie, с ключевым словом понятно это очевидно но если, опять таки, предположить, что NULL != (void*)0 все операции вида if (p), if (!p) идут лесом |
| Автор: jonie 16.8.2007, 22:40 | ||||
| я имею в виду "бинарный нуль" во времен выполнения).. и только. т.е. if(p) {наш код} не факт что будет компилироваться в подобное
о чем я и говорил
|
| Автор: MAKCim 16.8.2007, 22:49 |
такой код не будет генерироваться никогда если if (p) ~ if (p != 0) и компилятор тут ничего не сможет сделать ему неизвестно значение p, поэтому он будет действовать по шаблону |
| Автор: jonie 16.8.2007, 23:03 | ||
| сори опечатался) там jnz конечно же. и там не код, а псевдокод опять же. т.е. eax - это наше значение p, сравниваем с нулем (вот где тот нуль о чем я говорю).... но этого нуля там может и не быть - это неизветно никому, кроме компилятора. Он вполне может компилировать код if(p) {наш код} в нечто такое
вот это 121212h и есть то внутренее представляние нулевого указателя, которое нам недоступно. |
| Автор: Fazil6 16.8.2007, 23:14 | ||
Попробуй добавить элементы в этот "списка инициализации массивов".... или убери скобки и увидишь что получится. Вообще-то фигурные скобки здесь по барабану, и следовательно никакого списка инициализации массива здесь нет, просто тупо приведением типа из символа \0 получается NULL. |
| Автор: Rockie 17.8.2007, 10:48 | ||
Чтоб далеко не ходить - с того же сайта
|
| Автор: UnrealMan 17.8.2007, 11:01 | ||||||
Не, массивы тут не при чём:
Что же касается массивов
то это уже инициализация агрегатов (см. §8.5.1 Aggregates). Неправда |
| Автор: MAKCim 17.8.2007, 11:05 |
неправда в общем случае в моем случае правда а за цитату из стандарта + |
| Автор: UnrealMan 17.8.2007, 11:07 | ||||||
В стандарте C++ есть понятия null pointer value и null pointer constant (которая может быть преобразована к null pointer value):
Таким образом, любая константа интегрального типа, равная нулю, будь то 0, '\0', false или 1+5-2*3 может быть использована как нулевой указатель. А про NULL сказано следующее:
|
| Автор: JackYF 17.8.2007, 15:07 |
| UnrealMan, да, теперь яснее. Век живи, век учись. Держи +. |