Я искал скомпилированную сборку из компилятора GNU g ++, и похоже, что это приводит к бесконечному циклу (частичный вывод g ++ -S file.c -o out):
.L3:
movq array2(%rip), %rax
movq array1(%rip), %rdx
movq -8(%rbp), %rcx
salq $3, %rcx
addq %rcx, %rdx
movq (%rdx), %rdx
andl $1, %edx
salq $3, %rdx
addq %rdx, %rax
movq (%rax), %rdx
movq temp(%rip), %rax
andq %rdx, %rax
movq %rax, temp(%rip)
subq $1, -8(%rbp)
jmp .L3
Все это либо команды movq, либо инструкции вычисления, кроме последней инструкции jmp, но это только возвращает нас к .L3.Это тело следующего кода:
ull i; // unsigned long long int
for (i = x - 1; i >= 0; i--)
temp &= array2[array1[i] & 1];
Как происходит выход из цикла?Похоже, он просто уменьшает i (subq $ 1, -8 (% rbp)) и перезапускается без сравнения.