The ? is called the conditional operator.
It acts as an if-then-else statement, only difference is that it actually returns something upon evaluation.
Take this simple example:
// ex 1
if (condition)
name = "Female";
else
name = "Male";
// ex 2
name = condition ? "Female" : "Male";
These two examples are identical. The conditional operator consists of two clauses (other than the condition), one before and one after the colon : -- the before is evaluated on condition == true, and the after is evaluated on condition == false.
The < is simply an operator that checks whether the left hand side is less than the right hand side. 1 < 2 == true, whereas 3 < 2 == false.
ViewData["greeting"] is just the item with index greeting
in the array ViewData.
The whole code simply assigns a greeting message based on the current time.
EDIT:
As noted above, int hour = DateTime.Now.Hour;
assigns the current hour (0-23) to the integer variable hour