The answer to your question depends upon which C language it is asking about.
The language described in Dennis Ritchie's 1974 C Reference Manual was a low-level language which offered some of the programming convenience of higher-level languages. Dialects derived from that language likewise tended to be low-level programming languages.
When the 1989/1990 C Standard was published, however, it did not describe the low-level language which had become popular for programming actual machines, but instead described a higher-level language which could be--but was not required to be--implemented in lower-level terms.
As the authors of the C Standard note, one of the things that made the language useful was that many implementations could be treated as high-level assemblers. Because C was also used as an alternative to other high-level languages, and because many applications didn't require the ability to do things that high-level languages couldn't do, the authors of the Standard allowed implementations to behave in arbitrary fashion if programs tried to use low-level constructs. Consequently, the language described by the C Standard has never been a low-level programming language.
To understand this distinction, consider how Ritchie's Language and C89 would view the code snippet:
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
on a platform where "char" is 8 bits, "int" is 16 bits big-endian,
"float" is 32 bits, and structures have no special padding or alignment
requirements so the size of "struct foo" is 8 bytes.
On Ritchie's Language, the behavior of the last statement would take
the address stored in "p", add 3*8+2 [i.e. 26] bytes to it, and fetch
a 16-bit value from the bytes at that address and the next, add one
to that value, and then write back that 16 bit value to the same two
bytes. The behavior would be defined as acting upon the 26th and 27th
bytes following the one at address p without regard for what kind of
object was stored there.
In the language defined by the C Standard, in the event that *p identifies
an element of a "struct foo[]" which is followed by at least three more
complete elements of that type, the last statement would add one to member
y of the third element after *p. Behavior would not be defined by the
Standard under any other circumstances.
Ritchie's language was a low-level programming language because, while it
allowed a programmer to use abstractions like arrays and structures when
convenient, it defined behavior in terms of the underlying layout of
objects in memory. By contrast, the language described by C89 and later
standards defines things in terms of a higher-level abstraction, and only
defines the behavior of code that is consistent with that. Quality implementations suitable for low-level programming will behave usefully in more cases than mandated by the Standard, but there's no "official" document specifying what an implementation must do to be suitable for such purposes.
The C language invented by Dennis Ritchie is thus a low-level language, and was recognized as such. The language invented by the C Standards Committee, however, has never been a low-level language in the absence of implementation-provided guarantees that go beyond the Standard's mandates.