[mdk-re] C/C++ question

Andrei Gerasimenko =?iso-8859-1?q?gak_=CE=C1_kaluga=2Eru?=
Пн Апр 30 17:51:01 MSD 2001


Да, офтопик, но...

----- 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
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
>
>





Подробная информация о списке рассылки community