Cả hai đều giống nhau và đây là cách bạn có thể tìm hiểu, bằng cách xem trình biên dịch làm gì (ngay cả khi không đặt tối ưu hóa thành cao):
Hãy xem trình biên dịch (gcc 4.0) làm gì với các ví dụ đơn giản của bạn: 
1.c:
main(){ int var; while(int i < 100) { var = 4; } }
gcc -S 1.c
1.s:
_main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
    movl    $0, -16(%ebp)
    jmp L2
L3:
    movl    $4, -12(%ebp)
L2:
    cmpl    $99, -16(%ebp)
    jle L3
    leave
    ret
2.c
main() { while(int i < 100) { int var = 4; } }
gcc -S 2.c
2.s:
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        movl    $0, -16(%ebp)
        jmp     L2
L3:
        movl    $4, -12(%ebp)
L2:
        cmpl    $99, -16(%ebp)
        jle     L3
        leave
        ret
Từ những điều này, bạn có thể thấy hai điều: thứ nhất, mã giống nhau ở cả hai.
Thứ hai, bộ nhớ cho var được cấp phát bên ngoài vòng lặp:
         subl    $24, %esp
Và cuối cùng, điều duy nhất trong vòng lặp là việc gán và kiểm tra điều kiện:
L3:
        movl    $4, -12(%ebp)
L2:
        cmpl    $99, -16(%ebp)
        jle     L3
Điều này hiệu quả nhất có thể mà không cần loại bỏ hoàn toàn vòng lặp.