Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
2-1127192246
извращенец2
2005-09-20 08:57
2005.10.16
Как узнать имя компьютера


4-1124183268
volser
2005-08-16 13:07
2005.10.16
Изменение рабочего стола


1-1127326492
Чайник
2005-09-21 22:14
2005.10.16
Проблема с отображением форм из DLL


2-1126790196
Unleashed
2005-09-15 17:16
2005.10.16
проблема с выводом в контейнер содержимого файла


2-1127111629
ZZZ
2005-09-19 10:33
2005.10.16
Сокращение времени компиляции.