一个bool型递归函数的返回值小疑问

把程序中的printf FOO注释掉之后,输出是status:0,如果不注释,那么输出是status:4。
请问为什么没有修改任何变量的printf语句把isValid返回的假变为了真?
把具体打印的"FOO"字符串变长,返回值变成了9,更无法理解了

bool isValid(char* s) // "{[()(){}]}"
{
    if (*s == *(s + 1))
        return true;
    else if (*(s + 1) == '{' || *(s + 1) == '(' || *(s + 1) == '[')
    {
        isValid(s + 1);
        //printf("FOO\n");
    }
    else
        return false;
}
int main(void)
{
    char ch[] = "{[()(){}]}";
    char* s = ch;

    printf("status:%d", isValid(s));

    return 0;
}

和printf无关,重新编译下,而且没判断字符串边界