Jenže vede k chybám.
To že auto může vjet do protisměru také vede k nehodám, a přesto se jízdní pruhy neoddělují betonovou bariérou. Ono se sice v 90% případů jezdí vpravo, ale občas se jiná možnost hodí, třeba při předjíždění nebo objíždění rozkopané silnice. Prostě to řízení tak funguje a je k tomu dobrý důvod, jinak by z toho byla autodráha. Dokonce se tahle vlastnost dá použít i k obracení, parkování a jiným více či méně nebezpečným vylomeninám, ale přitom jde pořád jen o změnu úhlu natočení předních kol

Řidič sám musí vědět co dělá, nikdo jiný ho neohlídá.
switch s rozumnými numerickými hodnotami může překladač přeložit "chytřeji" než posloupnost podmínek.
Rozhodně ano, přinejmenším by ten kousek kódu měl být kratší a rychlejší, pokud tedy bude fungovat jako jeden výběr z tabulky adres místo postupného provádění několika podmíněných skoků. Takže jak jsem psal, switch je zakuklený a vylepšený ekvivalent pozdějšího basicového
ON n GOTO label1, label2, label3..., což byl jeden z marných pokusů jak samotné používání GOTO trochu ukáznit a aspoň nějak ten špagetový kód strukturovat. (Ale FORTRAN to měl o "sto" let dříve!)
IMHO switch znamená přepnout či přepínač.
No však jo, přepínač na některý ze vstupních bodů toho bloku

Třeba v QBASICu (ne že by ten byl dobrý příklad) je to takhle:
SELECT CASE výraz
CASE IS >= 10
větev 1
CASE 2 TO 5
větev 2
CASE 1
větev 3
CASE ELSE
větev 4
END SELECT
Nikde žádný break, prostě SELECT jako výběr jedné z několika větví (a také žádná jiná možnost, aspoň bez použití GOTO). U switche se sice přesně tenhle případ použití uvádí v učebnicích, ale stejně jako většina věcí v C toho umí mnohem víc. Ještě spíš bych řekl že switch umí něco úplně jiného, ale k tomuhle se dá díky své univerzálnosti použít také.
Řekněme, že v "bezpečných" jazycích (jako je Karel

) má programátor jen jednu možnost jak to udělat a co smí udělat, nic jiného mu ten jazyk pro jistotu nedovolí. Tady v C má možností mnohem víc, a proto je také jen na jeho zodpovědnosti, jestli a jak si ohlídá že omylem nepoužil zrovna jinou možnost než chtěl, to není syntaktická chyba, spíš logická, jako kdyby místo A+B napsal A-B. Obojí jde a obojí je v tom jazyce správně, tak proč jedno z nich zakazovat jen proto že se používá méně často a "vede k chybám"? Ne, nevede, jen to prostě udělá něco jiného. (Však to odčítání je vlastně také úplně zbytečné, vždycky můžu použít A+(-B), nebo ne? Unární minus to jistí.)
Tohle prostě není Pascal, kde se padá do peřin a ještě navrch umí pofoukat bebíčko.
C je jako břitva, a pokud si někdo při holení uřízne nos, je to jen jeho chyba a buďto si měl dávat víc bacha nebo koupit Braun 
Navíc, jak jsem psal, toto použití je minoritní.
Ano, častěji se switch používá tak jako ten SELECT, troufl bych si tvrdit že je dost lidí kteří si ani neuvědomují že to jde i jinak (případně to považují za chybu):
|
----------------+-----------------
/ SELECT \
--+----------+----------+----------+--
| | | |
+---+---+ +---+---+ +---+---+ +---+---+
| blok1 | | blok2 | | blok3 | | blok4 |
+---+---+ +---+---+ +---+---+ +---+---+
| | | |
+----------+----+<----+<---------+
|
Ale to přece není důvod k omezování těch ostatních možností, které tam jsou! Ono to totiž ve skutečnosti funguje úplně jinak, protože příkaz switch je úmyslně navržený takhle:
|
----+-----
/ switch \
--+--+--+--+--
| | | |
| | | | +---------+
| | | +--+ příkaz1 |
| | | +----+----+
| | | |
| | | +----+----+
| | +-----+ příkaz2 |
| | +----+----+
| | |
| | +----+----+
| +--------+ příkaz3 |
| | break +--+
| +---------+ |
| |
| +---------+ |
+-----------+ příkaz4 | |
+----+----+ |
| |
+<------+
|
To je důvod proč se u každé větve musí psát ten break, aby se dosáhlo toho prvního stavu, zrovna break je tam jaksi navíc a umožňuje ten blok příkazů zase ve vhodném místě podle potřeby přerušit, klidně i podmíněně. Takže je to jeden blok s několika vstupními body, a pomocí break se z toho dá udělat SELECT.
Pro tyhle dvě možnosti by tedy "správně"(?) měla být dvě různá klíčová slova, jenže tvůrci Céčka si byli vědomi toho že po překladu do strojového kódu tam stejně zbydou jen nějaké CMP a JNZ a tak to všechno vohrábli jedním víceúčelovým příkazem, podobně jako celý zbytek tohohle jazyka, aby si nekomplikovali život a kompilátor. To jen potvrzuje názor, že C je nízkoúrovňový systémový jazyk, postavený jen o málo výš než assembler, který se sice moc nehodí na psaní větších programů, ale je dokonalý pro malé a rychlé kostky unixových skládaček:
http://cm.bell-labs.com/cm/cs/who/dmr/unixblocks.jpg Přesto ten jazyk má na víc, je otázka jestli na to mají i jeho programátoři.
Čili, defaultní možnost je, stejně jako u VŠECH ostatních příkazů, že se jede dál dokud je kam, a pokud to potřebuji z jakéhokoliv důvodu v libovolném místě přerušit, tak to udělám úplně stejným příkazem jako ve VŠECH ostatních případech - příkazem break. Kdyby to zrovna a jedině u switche bylo opačně, tak by to bylo pro programátora matoucí, navíc proti principům UNIXu - jednotnosti a univerzálnosti.
Nakonec, právě tebou zmíněný příkaz for je nejlepší ukázka toho jak univerzálně K&R uvažovali, protože do něj se dá zadat kromě běžného počítaného cyklu tolik nej(h)různějších možností a činností, že se k němu nakonec ani žádný blok příkazů psát nemusí (což neznamená že to není hrozná prasárna).
Ještě mě tak napadá, že třeba účelem ternárního operátoru určitě nebylo primárně tohle použití:
#define KOUPELNA 1
#define ZACHOD 2
#define CHODBA 4
unsigned int vypinace;
...
printf("V koupelně %s.\n", vypinace&KOUPELNA ? "se svítí":" je zhasnuto");
printf("Na záchodě je %s.\n", vypinace&ZACHOD ? "rozsvíceno":"zhasnuto");
printf("V chodbě %s.\n", vypinace&CHODBA ? "projdeš bezpečně":"se přerazíš");