Это означает, что вы вызываете неопределенное поведение.Давайте посмотрим, что происходит с каждой строкой кода:
result result; // ok, you have declared an union
result.marks = 90; // ok, result.marks is defined
result.grade = 'a'; // ok, result.grade is defined, but result.mark is no longer
writeln(result.grade); // ok, access to the last written member of the union
writeln(result.marks); // UB: access to a member which is not the last writter
UB действительно неприветливо для новичков, потому что может случиться что угодно:
- компилятор может обнаружить проблему и вызватьпредупреждение или ошибка (но это не обязательно ...)
writeln(result.marks)
может написать 90
или код символа 'a'
(97
) или ничего, или что-то еще дажезавершить программу
И, как бы то ни было, вы можете получить ожидаемое поведение за один прогон, а позже - другое.
Короче говоря, не играйте счто ...