Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
1

Использование имен предопределенных объектов в качестве имен переменных

19.07.2014, 12:13. Показов 3426. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout;
    cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
При его компиляции возникают ошибки, но на такие две программы компилятор не ругается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout, cin;
    //cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void func()
{
    int cout = 0, cin = 0;
    std::cout <<cout <<cin <<std::endl;
}
 
int main()
{
    func ();
    return 0;
}
В случае, если раскрыто пространство имен, в функции можно использовать имена "cout" и "cin" как имена переменных, только если в ней не используется ввод/вывод с помощью этих объектов. Иначе, использовать можно и объекты и имена переменных одновременно. Я так думаю. Так вот вопрос: эта ситуация как-то оговорена стандартом? И есть смысл писать так, или в определенных ситуациях это может привести к нежелательным последствиям?
Примеры компилировал в gcc 4.7.0 и MSVS 2010.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.07.2014, 12:13
Ответы с готовыми решениями:

Русские символы в качестве имен переменных
меня интересует вопрос, можно ли в VS++ 2010 в качестве имен переменных использовать русские буквы?...

Использование ссылок и обычных имен переменных
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто...

Использование переменных вместо имен таблицы и полей в SQL-запросах
что-то у меня ругается на подобную запись, пишет: 'неправильный синтаксис около конструкции...

Использование длинных имен переменных увеличивает вес файла с программой?
Использование длинных имен переменных увеличивает вес файла с программой?

19
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2014, 12:17 2
Цитата Сообщение от MicM Посмотреть сообщение
И есть смысл писать так
Давать переменным имена, совпадающие с объектами стандартной библиотеки? Нет, только запутывает.

По стандарту не проконсультирую, но разрешение имен объектов начинается с локальной области видимости. Объявленные в ней имена перекрывают глобальные, чтобы к ним обратиться - используется оператор ::.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout = 42;
    ::cout << cout << endl;
}
 
int main()
{
    func();
    return 0;
}
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 12:26 3
В первом варианте можно написать так:
C++
1
   cout <<cout << '\n';
но работать это будет совсем не так, как ожидается
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2014, 12:28 4
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 7 первого примера имеется неоднозначность какую cout использовать.
Там все однозначно - используется локальная переменная, просто нет оператора<<(int, std::basic_ostream<blablabla>)
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 12:31 5
Цитата Сообщение от MicM Посмотреть сообщение
При его компиляции возникают ошибки
Вот на них и стоит сделать акцент. Вот что выдал gcc:
error: invalid operands of types ‘int’ and ‘<unresolved overloaded function type>’ to binary ‘operator<<’
И я думаю, это многое должно объяснить.

Добавлено через 37 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
Там все однозначно
Я поэтому и дропнул пост Но, не достаточно быстро, видимо
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 12:32  [ТС] 6
0x10, к глобальным именам будут относится различные объекты и функции библиотек?

Добавлено через 34 секунды
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот на них и стоит сделать акцент. Вот что выдал gcc:
Да, это и выдал
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 12:34 7
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Так Вы написали
C++
1
using namespace std;
то имена стандартной библиотеки попали в глобальное пространство имен в данном случае.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2014, 12:36 8
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Скапитаню: к глобальным идентификаторам будут относиться идентификаторы, находящиеся в глобальной области видимости. Не важно, пользовательские или библиотечные.
1
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 12:37  [ТС] 9
Цитата Сообщение от Tulosba Посмотреть сообщение
но работать это будет совсем не так, как ожидается
Никак не отработало, просто ничего не вывело
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2014, 12:38 10
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Вывода быть и не должно, в данном случае это обычный оператор битового сдвига.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 12:39 11
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Потому что была выполнена операция побитового сдвига влево два раза
1
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 12:44  [ТС] 12
Блин, точно
Ведь локальная переменная cout перекрыла глобальный идентификатор cout и следующая запись стала рассматриваться как побитовый сдвиг.
C++
1
cout <<cout <<'\n';
А в случае с '\n' сдвиг будет производится на количество позиций, которое равно коду этого символа в ASCII?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.07.2014, 12:49 13
Ибо нечего бездумно раскрывать пространства имен.
Ну и вероятно имеет банальная опечатка: не cout а count
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 12:49 14
Цитата Сообщение от MicM Посмотреть сообщение
которое равно коду этого символа в ASCII?
Я бы сказал: на static_cast<int>('\n') бит
1
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 12:54  [ТС] 15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и вероятно имеет банальная опечатка: не cout а count
Не, так изначально и было задумано. Просто читаю сейчас читаю С.Прата "Язык программирования С++" и там прочитал это. Вот и заинтересовался и решил разобраться
Миниатюры
Использование имен предопределенных объектов в качестве имен переменных  
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.07.2014, 12:56 16
MicM, ну очень спорно написано, ибо на предыдущей страницы я приводил пример, который показывает, что использовать можно.
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 12:59  [ТС] 17
0x10, ага, вот тоже нашел
http://msdn.microsoft.com/ru-r... 1xz31.aspx
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 13:10 18
Цитата Сообщение от MicM Посмотреть сообщение
Просто читаю сейчас читаю С.Прата "Язык программирования С++"
Издание не древнее случаем? Может там ещё пространств имен не было.
Хотя по первому сообщению так и не скажешь.
0
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
19.07.2014, 13:14  [ТС] 19
Tulosba, 6-е издание, 2012 год
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
19.07.2014, 13:23 20
Цитата Сообщение от MicM Посмотреть сообщение
6-е издание, 2012 год
Ну тогда не знаю. Может трудности перевода А может и афтор шалит.
Кстати ещё для укрепления материала могу такой код предложить рассмотреть:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int cout = 42;
 
void func()
{
    int cout = 100500;
    printf( "%p\n", &std::cout ); // стандартный поток вывода
    printf( "%d\n", ::cout ); // глобальная переменная
    printf( "%d\n", cout ); // локальная переменная 
}
 
int main()
{
    func();
    return 0;
}
http://ideone.com/HcmCjb
2
19.07.2014, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2014, 13:23
Помогаю со студенческими работами здесь

Чтение имён переменных из файла и раскрытие этих переменных
Допустим есть скрипт &quot;1&quot;,в котором описано: set ueqrxbfmfi=t for /f &quot;usebackq tokens=*&quot; %%a in...

Имя типа или пространства имен отсутствует в пространстве имён
Доброго времени суток. Делаю пример SportsStore из книги &quot;ASP.NET MVC 3 Framework с примерами на...

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

Есть 50 имен в списке. Как сделать без сервера поиск среди этих 25 имен?
Всем привет, есть 50 имен в списке, как сделать без сервера поиск среди этих 25 имен? Допустим в...

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Поиск файлов по списку имён и по заданным расширениям с выводом полных имён найденных в текстовый файл
Доброго времени суток! Стоит задача сделать батник. Для поиска файлов по списку имён (кириллица)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru