Question: The following code compiles without problems:

```
int main() {
    printf("Hi" "Bye");
}

```

However, this does not compile:

```
int main() {
    int test = 0;
    printf("Hi" (test ? "Bye" : "Goodbye"));
}

```

What is the reason for that?

Answer: 
In `printf("Hi" "Bye");` you have two consecutive arrays of char which the compiler can make into a single array.

In `printf("Hi" (test ? "Bye" : "Goodbye"));` you have one array followed by a pointer to char (an array converted to a pointer to its first element). The compiler cannot *merge* an array and a pointer.
This does not compile because the parameter list for the printf function is

```
(const char *format, ...)

```

and

```
("Hi" (test ? "Bye" : "Goodbye"))

```

does not fit the parameter list.

gcc tries to make sense of it by imagining that

```
(test ? "Bye" : "Goodbye")

```

is a parameter list, and complains that "Hi" is not a function.