Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2010, 12:19   #1
Electron
Пользователь
 
Аватар для Electron
 
Регистрация: 31.01.2010
Сообщений: 29
По умолчанию Про использование оператора goto

Можно ли при написании современных программ использовать оператор
goto. И не могу понять почему все так избегают этот оператор как
злую собаку. Все равно на низком уровне после дизассемблирования там же есть что то вроде jmp,jz,jnz(тоже goto). Так почемсу же на ЯВУ нельзя?
Все идеальное просто
Electron вне форума Ответить с цитированием
Старый 14.07.2010, 12:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Потому чо считается что он усложняет анализ сложных программ глазами.
а так конечно можно, используй скок влезет, еси конечно твой компилятор его поддерживает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2010, 13:09   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

goto использовать можно и при написании современных, и доисторических программ. Но необходимо помнить, что goto может очень сильно запутать структуру программы, а при неграмотном использовании может привести к катастрофе.
Кроме того, для решения большинства задач, в которых вы можете использовать goto существуют явные конструкции языка, реализующие все что нужно непосредственным образом (например, циклы).
Впрочем, его действительно использовать можно использовать в некоторых случаях, где не существует более изящных решений, но необходимо использовать одно правило - осуществлять переход только вперед, иначе можно перейти в очень неожиданные места и получить очень трудноотлавливаемые ошибки.
Собственно - где действительно можно использовать goto - это, например, во вложенных циклах. Скажем, нужно вам найти в трехмерном массиве определенный элемент (зачем - не знаю):
Код:
int*** Array;
//...
int i, j, k;
int value;
//...
for (i = 0; i < Ni; i++)
 for (j = 0; j < Nj; j++)
  for (k = 0; k < Nk; k++)
   if (Array[i][j][k] == value)
    goto found;
printf("Not found!\n");

found:
printf("Found! Array[%d][%d][%d] == %d\n", i, j, k, value);
Другое дело, что если это оформить в виде функции, то вместо goto можно использовать return;.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 14.07.2010, 14:43   #4
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

чаще goto используется в парсерах текста. к примеру
Код:
void StrToColor(string str, int &a, int &r, int &g, int &b)
{
	int c = 0;
	a=0,r=0,g=0,b=0;
	while (str != "")
	{
		int pos = str.find(" ");
		if (pos > -1)
		{
SWITCH:
			switch (c)
			{
				case 0: a = atoi(str.substr(0,pos).c_str()); break;
				case 1: r = atoi(str.substr(0,pos).c_str()); break;
				case 2: g = atoi(str.substr(0,pos).c_str()); break;
				case 3: b = atoi(str.substr(0,pos).c_str()); break;
			}
			str.erase(0,pos+1);
			c++;
		}
		else
		{
			pos = str.length();
			goto SWITCH;
		}
	}
}
я использую goto, когда написал код , но мне вдруг понадобилось зациклить какойто участок (или всунуть оператор сравнения, а этот участок запихнуть в его блок), но лень добавлять табуляцию для всех строк (а я полюбому это делаю - привычка)
подпись

Последний раз редактировалось liljon; 14.07.2010 в 14:46.
liljon вне форума Ответить с цитированием
Старый 14.07.2010, 14:52   #5
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Цитата:
Сообщение от liljon Посмотреть сообщение
лень добавлять табуляцию для всех строк (а я полюбому это делаю - привычка)
Практически во всех ИДЕ Вы можете выделить нужное количество строк, ткнуть в кнопку таб и к ним ко всем добавится один отступ.
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Старый 14.07.2010, 15:01   #6
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от wyvern Посмотреть сообщение
Практически во всех ИДЕ Вы можете выделить нужное количество строк, ткнуть в кнопку таб и к ним ко всем добавится один отступ.
а я и не говорил что отодвигаю по одной строке.
подпись
liljon вне форума Ответить с цитированием
Старый 14.07.2010, 15:08   #7
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Occam's razor, huh...

Код:
void StrToColor(string str, int &a, int &r, int &g, int &b)
{
	int c = 0;
	a=0,r=0,g=0,b=0;
	while (str != "")
	{
		int pos = str.find(" ");
		if(pos == -1)
			pos = str.length();

		switch (c)
		{
			case 0: a = atoi(str.substr(0,pos).c_str()); break;
			case 1: r = atoi(str.substr(0,pos).c_str()); break;
			case 2: g = atoi(str.substr(0,pos).c_str()); break;
			case 3: b = atoi(str.substr(0,pos).c_str()); break;
		}
		str.erase(0,pos+1);
		c++;
	}
}
wyvern@localhost:~$ sudo emerge --unmerge world

Последний раз редактировалось wyvern; 14.07.2010 в 15:16.
wyvern вне форума Ответить с цитированием
Старый 14.07.2010, 15:18   #8
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

можно и так.
подпись
liljon вне форума Ответить с цитированием
Старый 14.07.2010, 15:21   #9
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

Что значит "можно" и так?
Мне пришлось потратить не одну минуту, чтобы понять, что в Вашем коде выполняется после чего...

Был бы алгоритм сложнее - он в принципе перестал бы быть поддерживаемым...
Это шикарный пример того, как НЕ надо использовать этот долбаный оператор, если не горишь желанием подпортить жизнь человеку, который будет за тобой код править...
wyvern@localhost:~$ sudo emerge --unmerge world
wyvern вне форума Ответить с цитированием
Старый 14.07.2010, 15:23   #10
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Более сложный пример для goto.
Код:
bool ParseBadWords(string &str, FILTER filter, REPORT &report)
{
	bool ret = false;
	report.out = "";
	report.badword->DeleteAll();
	report.bpos.clear();
	LList * list = new LList();
	
	
	int c = FindWords(str,list,filter);
	for (int i=0;i<c;i++)
	{
		string line = list->Strings(i),temp = line;
		//line = CutSameSymbols(line);


		if (filter.CheckHideWord)
		{
			if (CheckHideWord(line,filter))
			{
				if (filter.changeto != "" ) line = filter.changeto;
				report.type = HIDE_WORD;
				report.out += "\"" + temp + "\" is possible hided word\n";
				goto EXCEPT;
			}
		}

		line = CutSameSymbols(line);
		line = CutSymbols(line,filter.symbols);

		int r = CheckExcept(line,filter);
		if (r == EXCEPT_CHANGED)
		{
			report.type = EXCEPT_CHANGED;
			report.out += "\"" + temp + "\" is chagned to \"" + line + "\"\n";
			goto EXCEPT;
		}
		else if (r == EXCEPT_TRUE)
		{
			report.type = EXCEPT_TRUE;
			report.out += "\"" + temp + "\" is except word\n";
			goto EXCEPT;
		}


		LList * words = new LList();
		if (!TransformWord(line,filter.letter,words))
		{
			if ( Check(line,temp,filter,report) > -1)
			{
				delete words;
				report.type = BAD_WORD_FOUND;
EXCEPT:
				if (filter.changeto != "") list->Rewrite(line,i);
				if (report.type != EXCEPT_TRUE) ret = true;
			}
			else delete words;
		}

		else
		{
			for (int j=0;j<words->Count;j++)
			{
				string s = words->Strings(j);
				if (Check(s,temp,filter,report) > -1)
				{
					if (filter.changeto != "") list->Rewrite(s,i);
					ret = true;
					report.out += "with transform " + words->Strings(j) + "\n";
				}
			}	
			delete words;
		}

	}
подпись
liljon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль. использование условного оператора в теле операторов цикла с условием и после него машко Помощь студентам 1 22.06.2009 00:52
использование условного оператора после операторов цикла с условием машко Помощь студентам 8 21.06.2009 23:59
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Использование оператора условия Virtson Microsoft Office Access 2 15.12.2006 16:13