o que strlen () realmente deve retornar nesse código?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char qq[] = {'a' , 'b' , 'c' , 'd'};
    char qqq[] = "abcd";
    printf("%d\n" , sizeof qq / sizeof qq[0]); // line A
    printf("%d\n" , strlen(qq)); // line B
    printf("%d\n" , sizeof qqq / sizeof qqq[0]); // line C
    printf("%d\n" , strlen(qqq)); // line D

    system("pause");
    return 0;
}

Veja o código acima. A matrizqq tem quatro elementos nele e a matrizqqq possui cinco elementos, o último dos quais é'\0'. Então eu entendo as impressões da linha A4 e impressões da linha C5. A linha D está bem comigo. Eu entendi aquilostrlen(qqq) é igual a"sizeof qqq / sizeof qqq[0] - 1" ao lidar com cordas. Mas a linha B imprime15 o que me deixa perplexo. Por quê? (Eu uso o vs2012.)

questionAnswers(4)

yourAnswerToTheQuestion