ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

30.08.2008, 09:50
|
|
Новичок
Регистрация: 23.08.2008
Сообщений: 5
Провел на форуме: 145863
Репутация:
6
|
|
Сообщение от nerezus
Он не должен работать - область видимости, где есть X, заканчивается после } цикла for.
Поэтому и 'x' : undeclared identifier - все верно.
Модифицируй так:
int x;
for (x = 1; x <= 10; x++)
{
Вообщето правило области видимости, работает для фукнций, а не для составных операторов и для тел циклов, если мне не изменяет память...
P.S. У меня на Визуал С++ 6 скомпилировалось без ошибок.
|
|
|

30.08.2008, 10:13
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Вообщето правило области видимости, работает для фукнций, а не для составных операторов и для тел циклов, если мне не изменяет память...
Ты не прав: вот тебе пример:
Код:
#include "stdio.h"
int main() {
int x = 1;
printf("1: %d\n", x);
{
printf("2: %d\n", x);
int x = 2;
printf("3: %d\n", x);
}
printf("4: %d\n", x);
getchar();
return 0;
}
Переменная, объявленная во внутреннем блоке, замещает ту, которая объявлена во внешнем(примеры 2 и 3 в программе). Однако в конце блока она исчезает(примеры 3 и 4)
P.S. У меня на Визуал С++ 6 скомпилировалось без ошибок.
Очень старый компилятор. Обнови.
Более новые версии уже не компилят этот код. И правильно делают - в коде ошибка.
|
|
|

30.08.2008, 10:20
|
|
Познающий
Регистрация: 22.01.2007
Сообщений: 40
Провел на форуме: 179857
Репутация:
4
|
|
Ребятки ответы на Дейтела нужны!!! 2007 год книженция
|
|
|

30.08.2008, 11:31
|
|
Новичок
Регистрация: 06.06.2008
Сообщений: 19
Провел на форуме: 49002
Репутация:
3
|
|
Добрый день
Нужна книга по Visual C++ 2008
Нашол только старые и одну 2005-ого года
|
|
|

30.08.2008, 11:32
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Добрый день
Нужна книга по Visual C++ 2008
Нашол только старые и одну 2005-ого года
Спокойной ночи. Читай закрепленную в разделе тему.
|
|
|

30.08.2008, 13:02
|
|
Новичок
Регистрация: 16.08.2008
Сообщений: 19
Провел на форуме: 33376
Репутация:
3
|
|
Сообщение от nerezus
Он не должен работать - область видимости, где есть X, заканчивается после } цикла for.
Поэтому и 'x' : undeclared identifier - все верно.
Прошу прощения, я совершенно не понимаю, что такое область видимости.
Вы не могли бы показать где находится область видимости в коде полученном после компиляции этой программы?
Там четко видно, что переменная х находится по адресу dword ptr [ebp-4] даже после выхода из цикла for. И, следовательно, ее без проблем можно вывести на экран. Почему же тогда компилятор ругается?
Код:
//задаем х
00401588 mov dword ptr [ebp-4],1 //x=1
0040158F jmp 0040159a
00401591 mov eax,dword ptr [ebp-4] //
00401594 add eax,1 //x++;
00401597 mov dword ptr [ebp-4],eax //
0040159A cmp dword ptr [ebp-4],0Ah //x<=10
0040159E jg 004015c6
//{
//проверка х
004015A0 cmp dword ptr [ebp-4],5 //if(x==5)
004015A4 jne 004015a8
004015A6 jmp 004015c6 //break
//вывод х
004015A8 push offset 0046c03c //" "
004015AD mov ecx,dword ptr [ebp-4] //x
004015B0 push ecx
004015B1 mov ecx,004777e0 //cout
004015B6 call 004010ff //<<
004015BB push eax
004015BC call 00401285 //<<
004015C1 add esp,8
004015C4 jmp 00401591
//}
//вывод х
004015C6 push offset 004010c8 // \n
004015CB mov edx,dword ptr [ebp-4] // x
004015CE push edx
004015CF push offset 0046c01c //"Cukl prervan pri x == 5 "
004015D4 push 004777e0 //cout
004015D9 call 00401285 //<<
004015DE add esp,8
004015E1 mov ecx,eax
004015E3 call 004010ff //<<
004015E8 mov ecx,eax
004015EA call 004011e0 //<<
Последний раз редактировалось BEGINER; 30.08.2008 в 13:08..
|
|
|

30.08.2008, 14:02
|
|
Новичок
Регистрация: 04.06.2008
Сообщений: 24
Провел на форуме: 55730
Репутация:
16
|
|
область видимости переменной - это ее свойство, благодаря которому переменные можно делать локальными или глобальными. Если переменная объявлена в теле функции/цикла/условия, то и обращаться к ней можно только внутри тела функции/цикла/условия. Это вполне нормальное поведение для многих ЯП.
Например, если разработкой программы занимается целый отдел, то сколько человек в своих функциях объявят переменную i для использования в циклах. И надо как эти переменный разделять.
Еще пример: чтобы было в рекурсивных функциях, не будь у них своей области видимости? толку от них уж точно мало будет.
|
|
|

30.08.2008, 17:13
|
|
Новичок
Регистрация: 06.06.2008
Сообщений: 19
Провел на форуме: 49002
Репутация:
3
|
|
nerezus, читал ))
но книга старая...
|
|
|

30.08.2008, 19:56
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
в коде полученном после компиляции этой программы?
После компиляции - это уже бинарник. В каждом компилере он свой и т.д.
Тем более чтот я не знаю асм в достаточной степени, чтобы его так легко читать.
Я вообще веб-программист)
Просто я сказал факт. И мои слова подтвердил код(см. мой пример) и ошибка компилятора.
|
|
|

30.08.2008, 20:17
|
|
Участник форума
Регистрация: 18.08.2008
Сообщений: 159
Провел на форуме: 750247
Репутация:
92
|
|
BEGINNER, это просто одно из правил С++, которое облегчает жизнь. Просто такое джентельменской соглашение. Это все равно что закрытые члены класса. Вроде как они закрыты, однако если провести фокус с указателями, то можно спокойно получить к ним доступ.
Вы продемонстрировали исходник на асме. Используется регистр Ebp, которые работает со стеком. В данном коде очень мало переменных, а если их будет больше? Кто даст гарантию, что Х будет все время находится именно по этому адресу? Может компилятор решит на его место записать что-то другое и что дальше произойдет? Правильно, Х перестанет существовать. Зачем хранить уже не нужные переменные?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|