Форум: "Потрепаться";
Текущий архив: 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.039 c