What is the output of the following code snippet?

4 phương ánCó giải thích
Đề bài
void main(){
    int x = 4;
    int *p = &x;
    int *k = p++;
    int r = p - k;
    printf("%d", r);
}

Các phương án trả lời

Chọn một phương án
Lời giảiChọn phương án để mở
Đáp án đúng: "1". Phép tăng sau p++ nộp cho k giá trị cũ của p rồi mới đẩy p sang ô int kế tiếp, nên k trỏ vào x còn p trỏ vào ô liền sau. Hiệu hai con trỏ cùng kiểu trong C được tính theo số phần tử chứ không theo byte: trình biên dịch lấy khoảng cách byte rồi chia cho kích thước kiểu, vì vậy p trừ k bằng 1. Ý "4" sai vì 4 chính là khoảng cách tính bằng byte khi int chiếm 4 byte, tức là bỏ qua bước chia cho kích thước kiểu; nó lại trùng với giá trị của x nên càng dễ nhầm. Ý "5" sai vì không có phép tính nào cộng thêm 1 vào giá trị của x. Ý "0" sai vì nó cho rằng p++ chưa kịp có tác dụng hoặc k mãi mãi đi theo p; cần công bố rằng đây là khuyết điểm của đề, bộ khoá đi kèm ghi đúng giá trị 0 trong khi ngữ nghĩa của phép tăng sau buộc p và k phải lệch nhau đúng một phần tử.

Cùng phần 5

Xuất hiện trong 2 bộ đề