В этом выражении
((year % 4) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n"
строковые литералы преобразуются в указатели на их первые элементы, и вы не можете инициализировать массив символов указателями.
Чтобы сделать его более понятным, рассмотримследующая демонстрационная программа
#include <stdio.h>
int main(void)
{
char s1[] = "y";
char s2[] = "y" + 0;
}
Первое объявление массива
char s1[] = "y";
будет успешно скомпилировано. Для инициализации массива используется строковый литерал.
Второе объявление массива
char s2[] = "y" + 0;
не будет компилироваться, поскольку в выражениях строковые литералы преобразуются (с редкими исключениями) в указатели на их первыйelements.
Используйте вместо этого следующий подход
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int year;
printf("%s","Please enter a year: ");
scanf("%d",&year);
char leapYear[2];
strcpy( leapYear, ( (year % 4 ) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n" );
printf("%s", leapYear);
}
И, как Пол Огилви написал в комментарии вместо массива, вы можете определить указатель наподобие
const char *leapYear = ((year % 4) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n" ;