关于数组的定义方式问题

以下一切从简
#define M 10(如果是const int n=10;是否可行)
int a[M];
是否可行?
int n;
scanf("%d",&n);
int a[n];
是否可行?
int a[2+2*4];
是否可行?

#define M 10(如果是const int n=10;是否可行)
int a[M];
可行


int n;
scanf("%d",&n);
int a[n];
不可行(部分编译器可行,如vscode,标准C中不可行)


int a[2+2*4];
可行