ALT Linux Community general discussions
 help / color / mirror / Atom feed
From: Serge Skorokhodov <suralis@pisem.net>
To: mandrake-russian@altlinux.ru
Subject: Re: [mdk-re] C/C++ question
Date: Mon Apr 30 20:28:11 2001
Message-ID: <20010430163208.85B2A5B3@ser-linux.ffyud> (raw)
In-Reply-To: <009201c0d17c$f7134900$bc84943e@voyager>

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



  reply	other threads:[~2001-04-30 20:28 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-04-30 14:09 Serge Skorokhodov
2001-04-30 14:28 ` Egor Azanov
2001-04-30 18:27   ` Serge Skorokhodov
2001-04-30 17:51 ` Andrei Gerasimenko
2001-04-30 20:28   ` Serge Skorokhodov [this message]
2001-04-30 21:28 ` Michael Ivanov
2001-05-03 12:30   ` Serge Skorokhodov
2001-05-03 14:02     ` Sergey Vlasov
2001-05-03 15:54       ` Re[2]: " Serge Skorokhodov
2001-05-03 19:12         ` Sergey Vlasov
2001-05-04 19:18           ` Serge Skorokhodov
2001-05-04 19:22             ` Sergey Vlasov
2001-05-04 20:30               ` Serge Skorokhodov
2001-05-04 20:38                 ` Sergey Vlasov
2001-05-04 23:37                   ` Serge Skorokhodov
2001-05-03 20:24     ` Michael Ivanov
2001-05-03 21:22     ` Sergei
2001-05-04  9:50     ` Mikhail Zabaluev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20010430163208.85B2A5B3@ser-linux.ffyud \
    --to=suralis@pisem.net \
    --cc=mandrake-russian@altlinux.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git