From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <009201c0d17c$f7134900$bc84943e@voyager> From: "Andrei Gerasimenko" To: References: <20010430101146.AD9A76AC@ser-linux.ffyud> Subject: Re: [mdk-re] C/C++ question MIME-Version: 1.0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 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 List-Help: List-Post: List-Subscribe: , List-Id: Linux-Mandrake RE / ALT Linux discussion list List-Unsubscribe: , List-Archive: Date: Mon Apr 30 17:51:01 2001 X-Original-Date: Mon, 30 Apr 2001 17:53:05 +0400 Archived-At: List-Archive: List-Post: Да, офтопик, но... ----- 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 0040D68B jne main+3Ah (0040d69a) Как говорится, no comment. ............ > -- > Serge Skorokhodov aka suralis > mailto:suralis@pisem.net > > _______________________________________________ > Mandrake-russian mailing list > Mandrake-russian@altlinux.ru > http://altlinux.ru/mailman/listinfo/mandrake-russian > >