#define dprint(expr) printf(#expr " = %gn", expr)
When this is invoked, as in
the macro is expanded into
printf("x/y" " = &gn", x/y);
and the strings are concatenated, so the effect is
printf("x/y = &gn", x/y);
Within the actual argument, each " is replaced by " and each by \, so the result is a legal string constant.
The preprocessor operator ## provides a way to concatenate actual arguments during macro expansion. If a parameter in the replacement text is adjacent to a ##, the parameter is replaced by the actual argument, the ## and surrounding white space are removed, and the result is re-scanned. For example, the macro paste concatenates its two arguments:
#define paste(front, back) front ## back
so paste(name, 1) creates the token name1.