Да.
$c = true;
$not_c = !$c; // $not_c is now false
$c = !$c; // same as above, but assigning the result to $c. So $c is now false
$c = !$c; // $c is now true again
Предоставленный вами фрагмент можно переписать (и, возможно, сделать более понятным) следующим образом:
$c = true;
foreach ($posts as $post) {
$c = !$c;
echo '<div' . ($c ? ' class="odd"' : '') . ">$post</div>";
}
Синтаксис $c ? ... : ...
использует троичный оператор. Это что-то вроде краткого заявления if. Например, true ? "a" : "b"
оценивается как "a".