Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

MS VC++ - загадка   Найти похожие ветки 

 
han_malign ©   (2005-09-22 15:56) [0]

BYTE p[3] = {0x01, 0x02, 0x03};
WORD wSequence = ((WORD)(*p++) << 8) + (WORD)*p++;

- угадайте чему равно wSequence?
а:
WORD wSequence = ((WORD)*(p++) << 8) + (WORD)*p++;
- ?

Microsoft Development Enviroment 2003 Version 7.1.3088
Microsoft Visual C++ .NET   69586-335-0000007-18759


З.Ы. Если угадали - то чему должно быть равно на самом деле, согласно спецификации ANSII C(++)?


 
вразлет ©   (2005-09-22 16:15) [1]

p++

Эт че за запись такая?


 
han_malign ©   (2005-09-22 16:21) [2]


> Эт че за запись такая?

- это развод?


 
вразлет ©   (2005-09-22 16:23) [3]

Неа, и че, компилится?


 
begin...end ©   (2005-09-22 16:25) [4]

> вразлет ©   (22.09.05 16:23) [3]

А чё, не должно?


 
вразлет ©   (2005-09-22 16:25) [5]

begin...end ©

дык вроде p -константа


 
Ega23 ©   (2005-09-22 16:27) [6]

вот за такие "закидоны" я и не люблю С.


 
Mike B. ©   (2005-09-22 16:30) [7]

> вразлет ©   (22.09.05 16:15) [1]
там, ко всему прочему еще * и скобки


 
Val ©   (2005-09-22 16:36) [8]

как я понимаю, в первом случае д.б. *p = *p+1, во втором *(p = p + 1), потом сдвиг?


 
isasa ©   (2005-09-22 16:38) [9]

а еще вариант ? :)
WORD wSequence = ((WORD) (*p)++ << 8) + (WORD)*p++;


 
uw ©   (2005-09-22 16:39) [10]

han_malign ©   (22.09.05 15:56)  

Ты хочешь сказать, что VC++ .NET это компилирует без ошибок?


 
Zz_   (2005-09-22 16:41) [11]

Типичное UB


 
han_malign ©   (2005-09-22 16:49) [12]

поясню в чем прикол:
ВО ВСЕХ пособиях по С/С++, при разборе приоритетов операций, при пояснении что у "объединяющих скобок" наивысший приоритет, специально, большим шрифтом, поясняется постфиксный инкремент в скобках (p++) - работает так же как префиксный ++p...
Хрен там, у MS другое мнение, клали они на все скобки - у них постфиксный инкремент имеет глобально низший приоритет - оба инкремента делаются в самом конце, во всех вариантах.
В обоих случаях wSequence == 0x0101, хотя в первом случае должно быть 0x0102, во втором 0x0202...

Меня собственно интересовал вариант 0x0102, который должен был получиться и без скобок(выше выделенных жирным), должно было хватить и ((WORD)*p++ << 8).
Скобки я добавил потом - и каково же было мое удивление...


 
han_malign ©   (2005-09-22 16:55) [13]


> дык вроде p -константа

- константа это {0x01, 0x02, 0x03}, а p - это указатель на буфер размером 3 байта, инициализированный этой константой...


 
вразлет ©   (2005-09-22 17:02) [14]

han_malign ©

VC++ 6 на р++; выдает

error C2105: "++" needs l-value


 
han_malign ©   (2005-09-22 17:11) [15]


> вразлет ©   (22.09.05 17:02) [14]

ну сделай
BYTE _p[3] = {0x01, 0x02, 0x03};
PBYTE p = _p;
- у меня это в контексте разбора сетевого пакета, подменил на массив не
проверяя на корректность...


 
вразлет ©   (2005-09-22 17:12) [16]

han_malign ©  

пнятно


 
Igorek ©   (2005-09-22 17:36) [17]


> ВО ВСЕХ пособиях по С/С++, при разборе приоритетов операций,
>  при пояснении что у "объединяющих скобок" наивысший приоритет,
>  специально, большим шрифтом, поясняется постфиксный инкремент
> в скобках (p++) - работает так же как префиксный ++p...

Ты хочешь сказать, что
int a = 0;
int b = 0;
(b++) != a++;
?


 
han_malign ©   (2005-09-22 17:39) [18]


> (b++) != a++;?

- по спецификации да, в реализации MS - нет...


 
Igorek ©   (2005-09-22 17:41) [19]


> - по спецификации да, в реализации MS - нет...

Можно урл на этот раздел спецификации?


 
DiamondShark ©   (2005-09-22 18:27) [20]

А кто вас заставляет рожать таких кракозоидов?
Ну пишите вы по чел-овечески:

wSequence := Word(p^) shl 8;
Inc(p);
wSequence := wSequence + Word(p^);
Inc(p);

или как там по порядку операций требуется.

Машкод получится точно такой же, и ФГМ читающему код не грозит.


 
Igorek ©   (2005-09-22 18:50) [21]


> DiamondShark ©   (22.09.05 18:27) [20]

"Если вы считаете, что все программы должны выглядеть как программы на Паскале, то вам следует программировать на Паскале а не на С++"


 
DiamondShark ©   (2005-09-22 19:00) [22]


> Igorek ©   (22.09.05 18:50) [21]

Разверни мысль.


 
Igorek ©   (2005-09-22 19:05) [23]


> Разверни мысль.

Дальше некуда. Это цитата.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.048 c
1-1127831282
Игорь Степанов
2005-09-27 18:28
2005.10.16
Программное управление скоростью повтора кода клавиши


2-1126872993
out
2005-09-16 16:16
2005.10.16
DBGrid


14-1127831750
LordOfRock
2005-09-27 18:35
2005.10.16
Metallica


14-1127476705
Prohodil Mimo
2005-09-23 15:58
2005.10.16
Подскажите конфигурацию сервера


5-1102660811
Denis_Ac
2004-12-10 09:40
2005.10.16
Изменение размеров потомка TCustomGroupBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский