Почему это использование запятой работает в выражении, но не в объявлении?

Я из ООП-языков высокого уровня C # и Java, и недавно начал чесать голову в C. Я чувствую C немного странно, как и JS. Поэтому хочу уточнить ниже:

Ниже приведена ошибка, и это кажется интуитивно понятным, поскольку выглядит как неправильный синтаксис даже в языках ООП

int i=0,1,2;  

/*
Error : expected identifier or ‘(’ before numeric constant
 int i = 0, 1, 2;
            ^
*/

Однако ниже работает удивительно:

int i;
i = 0,1,2;    //works

Почему это поведение? Имеет ли какое-то значение сохранение такого поведения или просто некоторые технические особенности?