Компилируем следующую строчку if(b<a) a=b а на выходе получаем: 004113DD mov eax,dword ptr 004113E0 cmp eax,dword ptr [a] 004113E3 jge wmain+4Bh (4113EBh) 004113E5 mov eax,dword ptr 004113E8 mov dword ptr [a],eax ... 004113EB xor eax,eax И как это понимать? Я же задал ЕСЛИ А БОЛЬШЕ B-> присваиваем А значение B, а скомпилилось в ЕСЛИ А БОЛЬШЕ ЛИБО РАВНО B-> обнуляем А!!!!!!!!!! Произвол!! В чем дело!?
b<a <=> a>=b, а обнуляется твоя a потому, что не была инициализирована, скорее всего. ня? .3 в любом случае, moar code.
Com[e]r да, сначала просто резервируется память под переменные, а значения вводятся позже с консоли. сейчас попробую с инициализацией. ЗЫ: вроде я читал где-то что переменные в С не обязательно инициализировать. достаточно их объявить. это СИшная фича, в отличае от Паскаля например. Сейчас попробую и отпишусь.
дурной тон есть дурной тон. за исключением необоснованного дурного тона, естественно. так или иначе, оно тебе обнулило непроинициализированную переменную, всё идёт по плану.
Com[e]r да, Вы правы. Инициализировал всё пошло как надо. Хм.. и всё-таки нехорошо как-то, ведь я читал про необязательную инициализацию в каком-то учебнике по С. причем учебник серьёзный, для вузов.. хочется побить автора за такие наколы))
Если у кого ещё есть примеры по сабжу(кроме инициализации переменных), приводите. Очень интересно. ЗЫ: в принципе можно обсуждать не только VS C++, но и любые другие сишные компиляторы.
GoldFinch VS и стандарт, Ха .... Neonix Вы посмотрите сколько багов в дизассемблере, вот это смеху... раньше я думал что MS нормально дизассмит, но реально, редко используемые команды такие глупости...
П.С. Выяснил когда смотрел diStorm, в котором оказалось баги, в некоторых VS выигрывает в некоторых проигрывает ...
IceCrashLdr что за diStorm? зачем, если на всё есть Ида? Кстати насчет дизасма от студии, правда полный гуан.
IceCrashLdr я про это и говорю. другие критерии не в счет. вот Вы говорите редко используемые команды не правильно анализирует, а вот и нет! обламывается на на самых обыкновенных. те же джампы чего стоят..
Где тут произвол, ткните пальцем! При чем тут неинициализированные - инициализированные, ткните пальцем! Все совершенно правильно. Скомпилировалось в (ЕСЛИ Б МЕНЬШЕ А, А=Б), кристально ясно и понятно. Ничего нигде не обнуляется, фантазии это ваши. Обнуляется eax - так это типа признак sucсess, return(0). Или еще для каких надобностей. С чего вы вдруг решили, что обнуление eax = обнулению [a]?
Более того, после Код (Text): 004113DD mov eax,dword ptr [b] 004113E0 cmp eax,dword ptr [a] [b]004113E3 jge wmain+4Bh (4113EBh) в eax находится а вовсе не [a] )
Booster пример выше. программа работает нормально, а дизассемблер от VS совсем другую логику выдает в листинге.
jge и je разные вещи+прыгает на обнуление, когда выполнилось правильное условие. А как вам вам такая штука дебагера: задаем _stack=new Stack<Int32>() затем толкаем значения _stack.Push(1); _stack.Push(2); _stack.Push(3); ... _stack.Push(n); далее Int32 StackItem{get{return _stack.Pop();};} дебагер нам выдаст значение n в StackItem при просмотре его значения затем ещё раз get{return _stack.Pop();} и дебагер показывает что в стеке уже n-1! как вам это нравится? то есть он выполняет конструкцию _stack.Pop(), вместо того чтобы просто возвратить значение верхушки стека.
FatMoon С чего вы вдруг решили, что обнуление eax = обнулению [a]? дада, разобрался.. глюк в голове) там сравнивается В с А, а не А с В, с этого я и пошел ахинею нести=) Y_Mur ясный пень. я на cmp ступил=) бывает..