Ни на что нельзя опираться. Выражение DateTime.Now < DateTime.Now
задействует два побочных эффекта, а это обычно кончается плохо.
Каждый вызов DateTime.Now
опирается на побочный эффект – получает текущее время. С одной стороны, мы, как будто, ничего не меняем. С другой стороны чтение меняющегося значения тоже побочный эффект.
Иногда язык определяет порядок вычисления подвыражений. Если это так, то левая сторона, скорее всего, будет вычислена первой. Если порядок не определён, то первой может вычисляться любая сторона неравенства.
Если язык быстрый, а разрешение используемого таймера низкое, то в большинстве случаев левая и правая сторона вернут одинаковые значения. Скорее всего это происходит в примере на JavaScript. В нём разрешение таймера 1ms, а интерпретатор успевает за миллисекунду исполнить десятки тысяч инструкций (Термин "быстрый" означает что язык успевает исполнить много инструкций за один тик таймера).
Если язык медленный, а таймер буквально наносекундный, то, чаще всего, будет неравенство. В C#, насколько я знаю, порядок вычисления определён: сперва вычислится левое подвыражение, потом правое. Правда в документации сказано что разрешение таймера от 0.5ms до 15ms. То есть получить неравенство больше одного раза нельзя. Но если вы запустите программу, которая печатает DateTime.Now.Ticks
в цикле, вы увидите что отметки времени выдаются разные каждые 100μs. То есть таймер обновляется 10 миллионов раз в секунду. А вызов DateTime.Now
на моём железе делается 30 миллионов раз в секунду. Это вполне сравнимые величины, которые могут, если вам повезёт, довольно долго выдавать неравенство для последовательных вызовов. В нашей терминологии C# оказался "медленным" языком.
В C подобное выражение вообще может оказаться неопределённым поведением, всё-таки два побочных эффекта в одном выражении, порядок вычисления которого не определён языком и может меняться в зависимости от фазы Луны, например.