From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Recipient: mandrake-russian@altlinux.ru From: Serge Skorokhodov To: mandrake-russian@altlinux.ru Subject: Re: [mdk-re] C/C++ question In-Reply-To: <009201c0d17c$f7134900$bc84943e@voyager> References: <20010430101146.AD9A76AC@ser-linux.ffyud> <009201c0d17c$f7134900$bc84943e@voyager> X-Mailer: Sylpheed version 0.4.65cvs7 (GTK+ 1.2.9; i686-mandrake-linux) Mime-Version: 1.0 Content-Type: text/plain; charset=KOI8-R Content-Transfer-Encoding: 8bit Message-Id: <20010430163208.85B2A5B3@ser-linux.ffyud> Sender: mandrake-russian-admin@altlinux.ru Errors-To: mandrake-russian-admin@altlinux.ru X-BeenThere: mandrake-russian@altlinux.ru X-Mailman-Version: 2.0 Precedence: bulk Reply-To: mandrake-russian@altlinux.ru X-Reply-To: suralis@pisem.net List-Help: List-Post: List-Subscribe: , List-Id: Linux-Mandrake RE / ALT Linux discussion list List-Unsubscribe: , List-Archive: Date: Mon Apr 30 20:28:11 2001 X-Original-Date: Mon, 30 Apr 2001 20:32:08 +0400 Archived-At: List-Archive: List-Post: On Mon, 30 Apr 2001 17:53:05 +0400 "Andrei Gerasimenko" wrote: > Да, офтопик, но... > > ----- Original Message ----- > From: "Serge Skorokhodov" > To: "ALT Linux list" > Sent: Monday, April 30, 2001 2:11 PM > Subject: [mdk-re] C/C++ question > > > > Здравствуйте! > > > > Это звучит немножко оффтопик, но хочется посоветоваться. > > > > В одной программе на "двухкрестовом" столкнулся со строчкой, > > наподобие следующего отрывка: > > > > char buf[BUFSIZ]; > > // ... > > if ( buf[0] == '\n' || buf[0] == '' ) > > ^^^^^^^^^^^^^^^^ > > { > > // ... > > } > > > > Ни я, ни компилятор этого места не поняли. Компилятору проще, он > > пожаловасля на то, что вовремя не нашел парный ':). А я вообще > > теряюсь в загадках. Я понимаю, что можно (в С) инициализировать > > int с помощью двух символов, но можно ли так инициализировать > > 32-битный int? И на какой же интеллект компилятора все это > > рассчитано, если предполагается, что надо разыменованый указатель > > на char привести к разыменованному указателю на int только > > потому, что в правой части оператора сравнения имеется символьный > > литерал, который имеет смысл только для инициализации 32-битного > > целого? Я из виндового мира, может, чего не понимаю? Просветите, > > у кого есть время и молоко:) > > Как раз из виндового мира компилятор такое понимает, хотя и по-офтопиковски: > запускаем Visual Studio на следующий main.cpp: > > #include > > char buf[200]; > > int main(void) { > buf[0] = ''; > if (buf[0] == '') > 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] = ''; > 0040D678 mov byte ptr [buf (004282b0)],3Eh > 7: if (buf[0] == '') > 0040D67F movsx eax,byte ptr [buf (004282b0)] > 0040D686 cmp eax,3C63723Eh У борланда примерно тоже (что на С, что на С++), только: move byte prt [buf], 0x3c и cmp eax, 0x3e72633c ; байты переставлены То, что по моему мнению подрузамевали авторы программы, а именно сравнение без вызова ф-ции сравнения строк в BC5.5 делает сл. код: char buf[] = ""; // ... if ( ((int *)buf)[0] == '' ) // ... > 0040D68B jne main+3Ah (0040d69a) > > Как говорится, no comment. В ARM однозначно говориться, что представление многолитерных констант зависит от реализации и их лучше избегать. Меня интересует другое. Является ли такая практика нормальной, хорошей и на каких соображениях она основана. Я, собственно, совершенно не против. Просто хочется понять, и мне, и установленному в Spring 2001 по умолчанию компилятору:) И последнее, личное. Андрей, судя по адресу Вы можете передать привет улице Чичерена, на которой прошла первая треть моей жизни:) -- Serge Skorokhodov aka suralis mailto:suralis@pisem.net