Здравствуйте, Аноним, Вы писали:
А>вот простая программа, в ней, понятно, вылетает exception А>как система определяет что переменная a не инициализирована?
Посмотри сгенерированный код
Любите книгу — источник знаний (с) М.Горький
Re[2]: Инициализация локальной переменной
От:
Аноним
Дата:
20.10.05 12:00
Оценка:
Здравствуйте, Bell, Вы писали:
B>Посмотри сгенерированный код
Спасибо, посмотрел, что получается компилятор знает о том, что нельзя ее использовать уже на этапе трансляции. Тк просто втавлена команда вызова процедуры обработчика использования неинициализированной переменной (__RTC_UninitUse). Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#
А>int _tmain(int argc, _TCHAR* argv[]) А>{ А> int a; А> a++; А> return 0; А>}
А>вот простая программа, в ней, понятно, вылетает exception А>как система определяет что переменная a не инициализирована?
А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий:
if(++a % 8 == 0)
DoSomeAction();
Ясно, что здесь совершенно не важно, с какого начального значения начнется инкремент. И если компилятор будет в таких случаях считать, что он умнее меня, я выкину его нахрен.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали:
B>>Посмотри сгенерированный код
А>Спасибо, посмотрел, что получается компилятор знает о том, что нельзя ее использовать уже на этапе трансляции. Тк просто втавлена команда вызова процедуры обработчика использования неинициализированной переменной (__RTC_UninitUse). Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#
Здравствуйте, SWW, Вы писали:
SWW>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий: SWW>
SWW>if(++a % 8 == 0)
SWW> DoSomeAction();
SWW>
SWW>Ясно, что здесь совершенно не важно, с какого начального значения начнется инкремент. И если компилятор будет в таких случаях считать, что он умнее меня, я выкину его нахрен.
Выкидывай С++ целиком. Это Undefined Behavior. Формально, там может лежать некоторое невалидное значение, для которого операция ++ не даст того, что ты хочешь. Пример из моей практики — неинициализированный bool — это такое его значение, что (to_be) || (!to_be) было равно false! Так что и ++ может сработать не так, как ты ожидаешь. И одно из его UB — это отладочные сообщения. Вполне себе практичное, полезное и не из области сфероконей. А что если через 10 лет все компиляторы введут такую проверку? Имеют ведь право. Уйдешь в ASM?
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, Аноним, Вы писали:
А>вот простая программа, в ней, понятно, вылетает exception А>как система определяет что переменная a не инициализирована?
Попробуй посмотреть в ASM это —
volatile x = false;
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А> int a;
if (x)
a = 1;
А> a++;
А> return 0;
А>}
Или введи значение x с клавиатуры.
Правильно работающая программа — просто частный случай Undefined Behavior
SWW>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий: SWW>>
SWW>>if(++a % 8 == 0)
SWW>> DoSomeAction();
SWW>>
PS. если a — статическая или глобальная переменная, то все ok.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Инициализация локальной переменной
От:
Аноним
Дата:
20.10.05 14:32
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Попробуй посмотреть в ASM это — ......
Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#
Потому что компилятор от MS такой .
Есть и другие, например Intel пишет:
test.cpp(4): warning #592: variable "a" is used before its value is set
a++;
^
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Аноним, Вы писали:
GN>Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#
GN>Потому что компилятор от MS такой .
Ну уж не надо его так обижать
warning C4700: local variable 'a' used without having been initialized
level 1, однако.
Правильно работающая программа — просто частный случай Undefined Behavior
Здравствуйте, gear nuke, Вы писали:
GN>Потому что компилятор от MS такой .
Ну уж не надо вот обижать VS. Компилятор там далеко не самый плохой. И warning у него такой есть и выдаёт его хорошо.
Скорее всего в какой-нибудь библиотеке используемой в проекте этот warning давят в хедерах. MFC, скажем, таким славится
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, _Winnie,
А>>>Почему не выдается варнинг или лучше ошибка, как, например, компилятором C#
GN>>Потому что компилятор от MS такой .
_W>Ну уж не надо его так обижать _W>
_W>warning C4700: local variable 'a' used without having been initialized
_W>level 1, однако.
Похоже, дело действительно в level !
Under /clr:safe this is a level 4 warning.
Видимо, код компилировался автором как managed.
Ну а я взял и поверил на слово, что msvc не ругается
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Erop, Вы писали:
E>Ну уж не надо вот обижать VS. Компилятор там далеко не самый плохой. И warning у него такой есть и выдаёт его хорошо.
Ага, уже понял. Давно не видел и забыл
E>Скорее всего в какой-нибудь библиотеке используемой в проекте этот warning давят в хедерах. MFC, скажем, таким славится
В atlmfc (из 2005) не нашёл. Нашёл только в valarray, но там же есть warning push\pop. Видимо, дело в /clr:safe
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
SWW>>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий: SWW>>>
_W>PS. если a — статическая или глобальная переменная, то все ok.
Потому что они инициализируются по умолчанию? Это понятно, но иногда я делаю такой счетчик членом класса. Я полагаю, для нее слелать при компиляции проверку на неинициализированность также сложно. И компилятор, кстати, на члены класса не выдает варнинг если он не инициализирован.
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, _Winnie, Вы писали:
SWW>>>А почему понятно? Мне, например, совершенно непонятно почему вылетает исключение. Я иногда использую неинициализированные переменные например для прореживания каких-то действий: SWW>>>
??>>вот простая программа, в ней, понятно, вылетает exception
??>>как система определяет что переменная a не инициализирована?
??>>#include "stdafx.h"
??>>int _tmain(int argc, _TCHAR* argv[])
??>>{
??>>int a;
??>>a++;
??>>return 0;
??>>}