sizeof(a)/sizeof(t)
codifica esplicitamente il tipo nell'espressione. Ora hai il tipo specificato in più posizioni, senza il supporto del compilatore per assicurarti di utilizzare lo stesso tipo. Quindi, se cambi il tipo base dell'array, ma non nell'espressione di conteggio (completamente separata), il bingo: il tuo codice verrà compilato bene, ma il conteggio degli elementi sarà errato. Se sei fortunato il tuo programma andrà in crash, ma in caso contrario funzionerà quasi completamente correttamente, ma ogni tanto si comporterà in modo totalmente strano.
sizeof(a)/sizeof(a[0])
è garantito corretto, richiede solo il nome dell'array. Cambia il tipo e stai bene; cambia il nome dell'array e il compilatore si lamenterà. Nessun pensiero richiesto: ci piace questo tipo di programmazione.