Ты не прав: вот тебе пример: Code: #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) Очень старый компилятор. Обнови. Более новые версии уже не компилят этот код. И правильно делают - в коде ошибка.
Прошу прощения, я совершенно не понимаю, что такое область видимости. Вы не могли бы показать где находится область видимости в коде полученном после компиляции этой программы? Там четко видно, что переменная х находится по адресу dword ptr [ebp-4] даже после выхода из цикла for. И, следовательно, ее без проблем можно вывести на экран. Почему же тогда компилятор ругается? Code: //задаем х 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 //<<
область видимости переменной - это ее свойство, благодаря которому переменные можно делать локальными или глобальными. Если переменная объявлена в теле функции/цикла/условия, то и обращаться к ней можно только внутри тела функции/цикла/условия. Это вполне нормальное поведение для многих ЯП. Например, если разработкой программы занимается целый отдел, то сколько человек в своих функциях объявят переменную i для использования в циклах. И надо как эти переменный разделять. Еще пример: чтобы было в рекурсивных функциях, не будь у них своей области видимости? толку от них уж точно мало будет.
После компиляции - это уже бинарник. В каждом компилере он свой и т.д. Тем более чтот я не знаю асм в достаточной степени, чтобы его так легко читать. Я вообще веб-программист) Просто я сказал факт. И мои слова подтвердил код(см. мой пример) и ошибка компилятора.
BEGINNER, это просто одно из правил С++, которое облегчает жизнь. Просто такое джентельменской соглашение. Это все равно что закрытые члены класса. Вроде как они закрыты, однако если провести фокус с указателями, то можно спокойно получить к ним доступ. Вы продемонстрировали исходник на асме. Используется регистр Ebp, которые работает со стеком. В данном коде очень мало переменных, а если их будет больше? Кто даст гарантию, что Х будет все время находится именно по этому адресу? Может компилятор решит на его место записать что-то другое и что дальше произойдет? Правильно, Х перестанет существовать. Зачем хранить уже не нужные переменные?
как в с++ разделить 127.0.0.1:8080 в массив к примеру на php: $address = "127.0.0.1:8080"; $array = explode(":", $address); echo $array[0]." - ".$array[1]; и как сделать на си++ примерно так (php): foreach($array as $key => $value) echo $key." ".$value."\n";
Code: // test.cpp : Defines the entry point for the console application. // #include <iostream> #include <cstdlib> #include <fstream> #include <string> #include <vector> #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { vector<string> vectIP; vector<string> vectPort; string strValues; fstream File("c:\\proxies.txt"); while (!File.eof()) { getline(File, strValues, ':'); vectIP.push_back(strValues); getline(File, strValues, '\n'); vectPort.push_back(strValues); } for (unsigned int i = 0;i < vectIP.size();++i) { cout << vectIP[i] << ":" << vectPort[i] << endl; } File.close(); system("pause"); return 0; } Это для файла. Если у тебя строка, то тут проще. Code: // test.cpp : Defines the entry point for the console application. // #include <iostream> #include <cstdlib> #include <string> #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { string strSomething = "127.0.0.1:8808"; int nPos = strSomething.find(':'); string strIP = strSomething.substr(0, nPos); string strPort = strSomething.substr(nPos+1); cout << strIP << ":" << strPort << endl; system("pause"); return 0; }
#include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int main() { float nomwet = 0, nachbal = 0, rashod = 0, prihod = 0, predel = 0, newbal = 0; while (nomwet != -1) {cout << "Vvedite nomer weta (ili -1): "; cin >> nomwet; cout << "Vvedite na4alniu balans: "; cin >> nachbal; cout << "Vvedite symmy rashodov: "; cin >> rashod; cout << "Vvedite symmy prihoda: "; cin >> prihod; cout << "Vvedite predel kredita: "; cin >> predel; cout << "HOMEP WETA: " << nomwet << endl; newbal = nachbal + rashod - prihod; cout << "Balans: " << newbal << endl; if (newbal > predel) cout << "PREDEL PREVUWEN!!!\n";} return 0; } Почему после ввода -1 цыкл сразу не прерывается а требует ввода всех остальных данных и только тогда прерывается?
Всё правильно, цикл сразу должен дойти до конца, после чего ин проверит nomwet и если она равна -1 завершится. Ппробуй что-нить в этом роде: Code: #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int main() { float nomwet = 0, nachbal = 0, rashod = 0, prihod = 0, predel = 0, newbal = 0; while (1) {cout << "Vvedite nomer weta (ili -1): "; cin >> nomwet; if (nomwet==-1) { getchar(); return 0; } cout << "Vvedite na4alniu balans: "; cin >> nachbal; cout << "Vvedite symmy rashodov: "; cin >> rashod; cout << "Vvedite symmy prihoda: "; cin >> prihod; cout << "Vvedite predel kredita: "; cin >> predel; cout << "HOMEP WETA: " << nomwet << endl; newbal = nachbal + rashod - prihod; cout << "Balans: " << newbal << endl; if (newbal > predel) cout << "PREDEL PREVUWEN!!!\n";} return 0; }
для чего сравнивать? в сортировке используется сравнение? Сортировки разные есть - по разному можно сравнивать 10 чисел - почти всегда только if используется, но иногда нет. Например, вот алгоритм сортировки Шелла : Напиши, подробнее что нужно.
Юзайте #include <algorithm> Изобретение велосипеда, это не true Code: // test.cpp : Defines the entry point for the console application. // #include <iostream> #include <cstdlib> #include <algorithm> #include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { const int nSize = 10; int nArray[nSize]; for (int i = 0;i < nSize;++i) cin >> nArray[i]; cout << *std::max_element(nArray, &nArray[10]) << endl;//дадада именно на 11 элемент. Это же итераторы system("pause"); return 0; }