[mdk-re] C/C++ question
Serge Skorokhodov
=?iso-8859-1?q?suralis_=CE=C1_pisem=2Enet?=
Пн Апр 30 20:28:11 MSD 2001
On Mon, 30 Apr 2001 17:53:05 +0400
"Andrei Gerasimenko" <gak на kaluga.ru> wrote:
> Да, офтопик, но...
>
> ----- Original Message -----
> From: "Serge Skorokhodov" <suralis на pisem.net>
> To: "ALT Linux list" <mandrake-russian на altlinux.ru>
> Sent: Monday, April 30, 2001 2:11 PM
> Subject: [mdk-re] C/C++ question
>
>
> > Здравствуйте!
> >
> > Это звучит немножко оффтопик, но хочется посоветоваться.
> >
> > В одной программе на "двухкрестовом" столкнулся со строчкой,
> > наподобие следующего отрывка:
> >
> > char buf[BUFSIZ];
> > // ...
> > if ( buf[0] == '\n' || buf[0] == '<cr>' )
> > ^^^^^^^^^^^^^^^^
> > {
> > // ...
> > }
> >
> > Ни я, ни компилятор этого места не поняли. Компилятору проще, он
> > пожаловасля на то, что вовремя не нашел парный ':). А я вообще
> > теряюсь в загадках. Я понимаю, что можно (в С) инициализировать
> > int с помощью двух символов, но можно ли так инициализировать
> > 32-битный int? И на какой же интеллект компилятора все это
> > рассчитано, если предполагается, что надо разыменованый указатель
> > на char привести к разыменованному указателю на int только
> > потому, что в правой части оператора сравнения имеется символьный
> > литерал, который имеет смысл только для инициализации 32-битного
> > целого? Я из виндового мира, может, чего не понимаю? Просветите,
> > у кого есть время и молоко:)
>
> Как раз из виндового мира компилятор такое понимает, хотя и по-офтопиковски:
> запускаем Visual Studio на следующий main.cpp:
>
> #include <stdio.h>
>
> char buf[200];
>
> int main(void) {
> buf[0] = '<cr>';
> if (buf[0] == '<cr>')
> printf("aha!\n");
> printf("done\n");
> return 0;
> }
>
> имеем вывод done и следующую диагностику
>
> main.cpp
> h:\coding\tests\progtest\tlin\main.cpp(6) : warning C4305: '='
> : truncation
> from 'const int' to 'char'
> h:\coding\tests\progtest\tlin\main.cpp(6) : warning C4309: '='
> : truncation
> of constant value
> Linking...
>
> Соответственно, результат компиляции (студия нумерует строки и с 0)
>
> 6: buf[0] = '<cr>';
> 0040D678 mov byte ptr [buf (004282b0)],3Eh
> 7: if (buf[0] == '<cr>')
> 0040D67F movsx eax,byte ptr [buf (004282b0)]
> 0040D686 cmp eax,3C63723Eh
У борланда примерно тоже (что на С, что на С++), только:
move byte prt [buf], 0x3c
и
cmp eax, 0x3e72633c ; байты переставлены
То, что по моему мнению подрузамевали авторы программы, а именно
сравнение без вызова ф-ции сравнения строк в BC5.5 делает сл. код:
char buf[] = "<cr>";
// ...
if ( ((int *)buf)[0] == '<cr>' )
// ...
> 0040D68B jne main+3Ah (0040d69a)
>
> Как говорится, no comment.
В ARM однозначно говориться, что представление многолитерных констант
зависит от реализации и их лучше избегать. Меня интересует другое.
Является ли такая практика нормальной, хорошей и на каких соображениях
она основана. Я, собственно, совершенно не против. Просто хочется понять,
и мне, и установленному в Spring 2001 по умолчанию компилятору:)
И последнее, личное. Андрей, судя по адресу Вы можете передать привет
улице Чичерена, на которой прошла первая треть моей жизни:)
--
Serge Skorokhodov aka suralis
mailto:suralis на pisem.net
Подробная информация о списке рассылки community