So this question has two parts: 1) How can the order of evaluation of a multi-argument function be determined? and 2) Why does () seem to be equivalent to Evaluate() in some cases?

I was plotting a user defined function:

```
Plot(f(x), {x, -10, 10}, ImageSize -> Large,
PlotLegends -> Map(ToString, c), PlotRange -> All)
```

but the output was not what I expected:

Easy fix; I put Evaluate() around the function and got what I wanted:

```
Plot(Evaluate(f(x)), {x, -10, 10}, ImageSize -> Large,
PlotLegends -> Map(ToString, c), PlotRange -> All)
```

Now to add some styling to the plots. The input

```
Plot(Evaluate(f(x)), {x, -10, 10},
PlotStyle -> Thickness(#) & /@ {0.01, 0.001}, ImageSize -> Large,
PlotLegends -> Map(ToString, c), PlotRange -> All)
```

does not plot, even though `Thickness(#) & /@ {0.01, 0.001}`

is a list. So I put Evaluate() around that and got what wanted:

```
Plot(Evaluate(f(x)), {x, -10, 10},
PlotStyle -> Evaluate(Thickness(#) & /@ {0.01, 0.001}),
ImageSize -> Large, PlotLegends -> Map(ToString, c),
PlotRange -> All)
```

Then, from another post on the site I realized that putting () around `Thickness(#) & /@ {0.01, 0.001}`

works too:

```
Plot(Evaluate(f(x)), {x, -10, 10},
PlotStyle -> (Thickness(#) & /@ {0.01, 0.001}), ImageSize -> Large,
PlotLegends -> Map(ToString, c), PlotRange -> All)
```

So maybe now I can go back and replace Evaluate(f(x)) with (f(x))!

```
Plot((f(x)), {x, -10, 10},
PlotStyle -> (Thickness(#) & /@ {0.01, 0.001}), ImageSize -> Large,
PlotLegends -> Map(ToString, c), PlotRange -> All)
```

Nope:

So what is going on??