Istnieje pewna instrukcja, która umożliwia przeskok do dowolnego miejsca w funkcji. Ma ona postać:
goto nazwa_etykiety;
w której etykieta jest identyfikatorem. Wykonanie instrukcji przejścia powoduje przejście do wykonania instrukcji opatrzonej etykietą nazwa_etykiety.
UWAGA! Wykonanie instrukcji goto nie może spowodować przejścia do wykonania instrukcji znajdującej się poza funkcją zawierającą daną instrukcję.
Instrukcja ta przeczy filozofii języka programowania C. Na samym początku powiedzieliśmy sobie, że charakterystyczną cechą tego języka (i większości innych) jest jego sekwencyjność; instrukcje są wykonywane w określonym porządku: od góry w dół i z lewej do prawej. Zastosowanie instrukcji skoku powoduje zachwianie tej fundamentalnej zasady. Istnieje naprawdę niewiele sytuacji, w których zastosowanie tej instrukcji byłoby uzasadnione. Za jedną z nich można by uznać wyjście z wielokrotnie zagnieżdżonej pętli w jednym skoku na zewnątrz wszystkich pętli. Oczywiście i w tym przypadku istnieją inne metody, jak użycie instrukcji break, czy poczciwe dobicie zmiennej licznika poza krańcową wartość (dla której pętla już się nie rozpocznie, bo wyrażenie warunkowe będzie fałszywe). W omawianych sposobach trzeba jednak wpisać kilka poleceń, aby uzyskać ten sam efekt, co dla jednej frazy ze słowem goto.
Nagminne używanie tej instrukcji nieuchronnie prowadzi do bełkotliwego kodu programu, zwanego kodem spaghetti (spaghetti TT). Niektórzy ludzie mówią, że używanie tej instrukcji jest niedopuszczalne. Nie jest to mimo wszystko dobre podejście. Instrukcja ta należy do standardu ANSI C i jej użycie jest dopuszczalne tam, gdzie inne konstrukcje są bardziej zawiłe.
W pliku chaos.c zawarte są przykłady użycia omawianej instrukcji. Ten program jest rzeczywiście chaotyczny, ale jest dobrym przykładem dlaczego programiści starają się unikać używania instrukcji goto. Jedynym miejscem w kodzie, gdzie omawiana instrukcja ma sens, jest ucieczka z trzykrotnie zagnieżdżonej pętli w jednym skoku. Plik bez_goto1.c oraz bez_goto2.c pokazują, jak można to samo zrobić bez używania instrukcji goto.
Cała reszta komend goto jest bezmyślną papką, całkowicie sprzeczną z naturą programowania w języku C. Analiza takiego programu nastręcza wielu problemów, a nie trzeba dużo główkować, by zauważyć, jak prosto można ten poplątany kod zastąpić sekwencyjnymi instrukcjami printf.