(isso é muito longo para ser um comentário e muito ruim para ser uma resposta)
getopt tenta detectar a opção de letra única com - (sinal de menos) e opção com argumento.
Ele pára quando não há opção (não mais) (não -b , não -a foo ). Não analisa a lista completa.
Então, a resposta para a segunda pergunta é sim.
Você pode desejar escrever um analisador getopt por conta própria e lidar com essa questão são -foo --bar arguements (por exemplo, um arquivo, uma string) ou uma opção.
por um longo tempo a tradição era colocar as opções primeiro, argumento depois, precisamente para que você soubesse quando a opção parasse, e se -foo fosse um nome de arquivo real.