state ? (cout << b / a << endl, exit(0)) : state = (a == 0) && (b == 0);
Не стоит так писать. Мало того что это выражение не укладывается в синтаксис, так еще оно из себя представляет слепую зону, код в которой невидим. Никому в голову не придет читать
exit(0)
или конструкцию присвоения внутри тернарного оператора.
По синтаксису: тернарный оператор
предполагает гарантированную выдачу одного из результатов. При этом, на выражения между
:
накладываются некоторые ограничения. Если выражения не проходят по ограничениям тернарного оператора, выражение тернарного оператора считается плохо сформированным, что и приводит к ошибке синтаксиса.