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: 
If you really want to have both branches produce compile-time string constants to be chosen at runtime, you'll need a macro.

```
#include <stdio.h>
#define ccat(s, t, a, b) ((t)?(s a):(s b))

int
main ( int argc, char **argv){
  printf("%s\n", ccat("hello ", argc > 2 , "y'all", "you"));
  return 0;
}

```
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.