Главная страница
    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.49 MB
Время: 0.069 c
1-1127394234
QwertyKz
2005-09-22 17:03
2005.10.16
штрих код


14-1127282930
DVM
2005-09-21 10:08
2005.10.16
Система для защищенного обмена документами в сети организации


1-1127510896
Студент:(
2005-09-24 01:28
2005.10.16
Вычисление С в степени N с минимальным количеством умножений


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


2-1126287506
Олег Л
2005-09-09 21:38
2005.10.16
Программирование на низком уровне.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский