Q:

How to understand the definition of a simple command?

From POSIX 2013:

A ‘‘simple command’’ is a sequence of optional variable assignments and redirections, in any
  sequence, optionally followed by words and redirections, terminated by a control operator.

From Bash Manual:

A simple command is the kind of command encountered most often. It’s just
  words separated by blanks, terminated by one of the shell’s control operators.

I feel the definition from POSIX is better than the one from Bash manual. But still I am not sure about the POSIX's definition:

If I am correct, the terminating control operator of a simple command doesn't belong to the command, or does it?
Do two "redirections" in the definition belong to the simple command?
What does "redirections" do after variable assignments, in "a sequence of optional variable assignments and redirections"? Variable assignments don't write to stdout or stderr, right?
What does "in any
sequence" in "a sequence of optional variable assignments and redirections, in any sequence" mean?
How many possibilities does the definition suggest for a simple command, and what are they?
Are POSIX's and Bash's concepts of a simple command the same?

A:

Adding to Greg's answer:

Yes, the two groups of redirections
belong to the same simple command.
When I run a command with input (stdin) and output (stdout) redirected,
I do it like this:
cmd  arg1  arg2  < file1  > file2
Some people (a vocal minority) advocate the
< file1  cmd  arg1  arg2  > file2
variation, because they believe that it's more intuitive
to specify the input, then the action, and then the output. 
But the following are all equivalent:
< file1  > file2  cmd  arg1  arg2
> file2  cmd  arg1  arg2  < file1
cmd  > file2  arg1  < file1  arg2
Don't use any of the above; they are presented as bad examples.
The point is that redirections can appear
before or after the first word of the command (or any word in the command),
but that they are treated the same.
Variable assignment(s) may come before the command,
to set environment variable(s) just for the duration (scope)
of that command.  For example,
TZ=GMT0 ls -l
lists your files, showing modification time in Greenwich Mean Time. 
"optional variable assignments and redirections, in any sequence" means that
TZ=GMT0 ls -l > ls_output_file
TZ=GMT0 > ls_output_file ls -l
> ls_output_file TZ=GMT0 ls -l
are all equivalent. 
Again, don't use any of these except for the first.
The point is that variable assignments cannot appear
after the first word of the command;
if they do, they will be treated as arguments to the command. 
For example, look at the syntax of dd.

Variable assignments don't write to stdout or stderr, right?

Simple, constant data assignments do not do any processing
(bookkeeping within the shell doesn't count). 
But command substitution runs a command; CURRENT_DATE=$(date +%Y%m%d)
runs the command date +%Y%m%d
with its stdout redirected to a pipe to the shell,
which captures the output and embeds it into the command line. 
But the stderr of the date command is still the stderr of the shell;
if you say OLD_DATE=$(date --date"three days ago"),
you will get an error message on the screen,
because date doesn't support that syntax for specifying the date. 
Of course you can suppress that
if you say
OLD_DATE=$(date --date"three days ago" 2> /dev/null)
but not if you say
OLD_DATE=$(date --date"three days ago")  2> /dev/null
or
2> /dev/null  OLD_DATE=$(date --date"three days ago")
"in any sequence" refers to the last thing I said, and also the fact that
TZ=GMT0 COLUMNS=132 ls -l
is equivalent to
COLUMNS=132 TZ=GMT0 ls -l
(There may be bizarre edge cases; let's not venture there.)

