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: 
According to the C Standard (5.1.1.2 Translation phases)

> 
> 1 The precedence among the syntax rules of translation is specified by
>  the following phases.6)
> 
> 
> 6. Adjacent string literal tokens are concatenated.
> 
> 
> 

And only after that

> 
> 7. White-space characters separating tokens are no longer significant. Each 
>  preprocessing token is converted into a token. **The resulting
>  tokens are syntactically and semantically analyzed and translated as a
>  translation unit**.
> 
> 
> 

In this construction

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

```

there are no adjacent string literal tokens. So this construction is invalid.
> 
> What is the reason for that?
> 
> 
> 

Your code using ternary operator conditionally chooses between two string literals. No matter condition known or unknown, this can't be evaluated at compile time, so it can't compile. Even this statement `printf("Hi" (1 ? "Bye" : "Goodbye"));` wouldn't compile. The reason is in depth explained in the answers above. Another possibility of *making such a statement using ternary operator valid to compile*, would also involve a *format tag* and the result of the ternary operator statement formatted as *additional argument* to `printf`. Even then, `printf()` printout would give an impression of "having concatenated" those strings only at, and as early as *runtime*.

```
#include <stdio.h>

int main() {
    int test = 0;
    printf("Hi %s\n", (test ? "Bye" : "Goodbye")); //specify format and print as result
}

```