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: 
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.
I would say that the "someFunction() + 2" is an expression being evaluated. Then I would say that "x = someFunction() + 2" is a statement, because most languages would generally evaluate the function's return plus two, and then assign that value to x.