You will wonder even more if I say that you can write even the following way :)
printf( "%c\n", 4["abcdefgh"] );
String literals in C have types of character arrays. Thus string literal "abcdefgh" has type char[9]. It includes also the terminating zero.
In expressions arrays as you correctly mentioned decay to pointers to their first elements. So the string literal decays to a pointer of type char *that points to the first character of the literal that is to 'a'
According to the C Standard (6.5.2.1 Array subscripting)
2 A postfix expression followed by an expression in square brackets []
is a subscripted designation of an element of an array object. The
definition of the subscript operator [] is that E1[E2] is identical to
(*((E1)+(E2))). Because of the conversion rules that apply to the
binary + operator, if E1 is an array object (equivalently, a pointer
to the initial element of an array object) and E2 is an integer,
E1[E2] designates the E2th element of E1 (counting from zero).
Thus this expression (*((E1)+(E2))) does not depend on whether the initial record was E1[E2] or E2[E1]
Returning to your code shippet you have that in this expression
4["abcdefgh"]
the string literal is converted to the pointer to its first character. You can imagine this like
char *p = "abcdefgh";
and you will get
4[p] is equivalent to *( 4 + p ) and results in lvalue of character 'e'