Примечание: я знаю, что этот ответ верен для C и C ++. Это не обязательно верно для других языков, и я не знаю, применимо ли это к Java.
Компилятор в основном свободен делать все, что не меняет внешнего поведения программы, так что да, они могут быть переупорядочены.
Думаю, вопрос немного философский. Необязательно, чтобы вы могли сказать, что определенная инструкция сборки принадлежит определенной строке в коде C. Часто это так, но часто нет, и если вы включите оптимизацию, она может немного изменить ситуацию.
В каком-то смысле вопрос бессмысленный, потому что, когда программа выполняется, она не выполняется line по строке. Одно исключение - если вы скомпилируете его с параметром отладки. Это позволит вам выполнять программу построчно. В этом случае они не будут переупорядочены.
Обратите внимание, что как только вы вызываете неопределенное поведение, компилятор может делать то, что он хочет. И да, иногда строка, вызывающая неопределенное поведение, вызывает довольно странную реорганизацию кода. Например, эта программа:
int main()
{
int a;
printf("Hello, World!\n");
a=1/0; // This causes UB
}
не гарантирует вывод «Hello, World!», Даже если строка, вызывающая UB, идет после печати.