Question: I read that an expression is anything that gives some value, like `2 + X`, while a statement is any instruction to the computer to execute something, like `print("hi")`.

What about the following line of code?

`X = someFunction() + 2`

`someFunction()` returns some numerical value (I think a lot of languages wouldn't compile this code if it didn't), and thus `someFunction() + 2` is 'something that yields some value' - aka an expression.

But, `someFunction()` is code to be executed, thus a statement.

My question:

There are often lines of code that **equal some value**, but are also an **instruction to be executed**. What are these lines of code considered?

Answer: 
In certain computer languages called "functional languages", everything--including the code that prints "hi"--is an expression. At the other extreme, you can write code in machine language (so you, not a compiler, are deciding exactly what sequence of bytes should compose the executable program), and at that level practically everything (even adding 2 to something) is an "instruction to the computer to execute something".

I've used a lot of different computer languages, and a far as I can recall, in each case there was documentation somewhere defining what makes a statement in that particular language (if indeed the language even has a concept of "statement"). The definition is based on syntax, not so much on what the code does.

For example, in C or C++, if you write

```
{ x + 2; }

```

then technically the "x + 2;" is a statement. It is a useless statement that doesn't do anything, but syntactically, it is a statement nevertheless. In fact, one way to write a statement in C is to just append a semicolon to an expression (<http://msdn.microsoft.com/en-us/library/1t054cy7.aspx>). You don't even need the expression; a semicolon by itself can be a statement (<http://msdn.microsoft.com/en-us/library/h7zyw61x.aspx>).

By the way, in C++, the '+' in an expression such as (x + 2) may actually be a function call. So if you say anything that calls a function is a statement, then (x + 2) would be, or at least could be, a statement in C++. But I don't know any authority who defines it that way.
It varies by language, but ultimately: a statement is anything you can't embed inside another (simple, i.e. not a block) statement.

In C, your example is an expression, because you can do this:

```
while (X = someFunction() + 2) {
    // ...
}

```

But in Python, the same thing is a syntax error, because `=` can *only* be a statement:

```
# nope!
while X = someFunction() + 2:
    pass

```

In most languages, any expression *can* also be used as a statement by itself, though this may or may not be useful.

Calling a statement an "instruction to execute something" is a poor way to think about it, though. *All* code is an instruction to execute something.

A statement is more like a single complete *thought*. It's really just part of the syntax; depending on the language/compiler/runtime, a statement or expression may become very many machine instructions, or several statements might be reduced to just one instruction.