Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ртфм'овский вопрос 
V
    Опции темы
Alek86
Дата 30.10.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



есть код:

Код

#include <iostream>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
using std::setw;

int main() {
    int i = 1;
    cout << setw(10) << "iNew " << i << endl;
    {
        int i = i + 1;
        cout << setw(10) << "iOld " << i << endl;
    }
    cin >> i;
}


на VS он дает ворнинги, но результат соответствененно 1 и 2
на билдере ни единого ворнинга, а результат 1 и <большое число>

если кому не лень, объясните, можно ли вообще так писать (по стандарту) и почему?

ЗЫ. по названию темы ясно, что вопрос ртфм'овский. но мой инглиш не настолько крут, чтоб я мог что-то стоящее найти из стандарта. потому просьба умникам не язвить, а кому не лень - доступно ответить smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Mad
Дата 30.10.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



ты внутри блока переопределяеш переменную

вот почему билдер сбрасывает ее значение в ноль при этом и не дает предупреждения - это вопрос

Добавлено через 33 секунды
Цитата(Alek86 @  30.10.2007,  15:30 Найти цитируемый пост)
int i = 1;
    cout << setw(10) << "iNew " << i << endl;
    {
        int i = i + 1;
        cout << setw(10) << "iOld " << i << endl;
    }




--------------------
user posted image
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Где-то тут начиная отсюда


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 30.10.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Mad, вопрос и заключался в том, что происходит, и насколько это корректно.
билдер не сбрасывает как раз, а берет мусор, а студия использует то значение i, что вне внутреннего блока



archimed7592, даже не знаю, что ответить. И спасибо, вроде ответ там есть, но я его не понял совершенно :(

Был бы искренне признателен, если бы кто-нить в нескольких словах хотя-бы (русских) объяснил, насколько корректен код (уже другой, тут вопрос более четко обозначен):

Код

#include <iostream>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
using std::setw;

class C {
public:
    C(int i) {
        cout << "Constructor" << endl; 
        this->i = i;
    }
    int operator++() {
        cout << "Operator ++" << endl;
        return ++i;
    }
private:
    int i;
};
int main() {
    C vC = ++vC;
}


поскольку на VS 2005 он выводит:

Operator ++
Constructor

что мне не очень нравится


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 30.10.2007, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  30.10.2007,  19:51 Найти цитируемый пост)
archimed7592, даже не знаю, что ответить. И спасибо, вроде ответ там есть, но я его не понял совершенно :(

Суть в том, что запись
Код

int x = x;

Вне зависимости от того, были ли в других областях видимости(в тех, что "содержат" текущую) объявления имени x, равносильна записи
Код

int x; // x = мусор
x = x; // x = мусор


В случае с vC - ты используешь объект ещё до его конструирования.

Добавлено @ 20:24
Цитата(Alek86 @  30.10.2007,  19:51 Найти цитируемый пост)
что мне не очень нравится 

Нравится тебе это или нет - такого правило стандарта. По приведённой мною ссылке можно увидеть пример, когда это имя используется не для того, что воспользоваться им как недоконструированным объектом, а для того, чтобы взять адрес этого объекта.

Это сообщение отредактировал(а) archimed7592 - 30.10.2007, 20:24


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 30.10.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



спасибо


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.