What is the purpose of the # operator, called the stringizer operator,
and how can it be used?

My book describes # in the following way, the bald part is what I do not understand.

The stringizer operator # must be followed by a parameter and **they are replaced with a string literal contructed from the argument's tokens, which are not first replaced** That is, the following input: 

```
#define W 124
#define str(a) (#a)

str(W)

```

produces the output: 

"W"

If we would like to have a **string literal** with the definition of a macro, we must use two function-like macros: 

```
 #define W 124
 #define xstr(a) (#a)
 #define str(b) (xstr(b))

```

which produces the output

"124"

**The reason for this is that the argument of the parameter b is completely replaced before the parameter is replaced in the replacement-list of str, which means that the invocation of xstr will use 124 as the argument which is then stringized in xstr**