Sự khác nhau về kết quả khi biên dịch trên các trình biên dịch khác nhau

Tranh thủ topic này, mình cũng xin thỉnh giáo các bạn về 10 câu sau, đây là những câu khá là kinh điển trong C và lớp mình cũng đang “tranh đấu” vì kết quả dự đoán không như mong đợi:
Câu 1:


int i = 10;
i = ++i + ++i;
printf("%d", i);

Câu 2:


int i = 10;
i = i++ + i++;
printf("%d", i);

Câu 3:


int i = 10;
i = ++i + i++;
printf("%d", i);

Câu 4:


int i = 10;
i = i++ + ++i;
printf("%d", i);

Câu 5:


int i = 10;
i = i++ + --i;
printf("%d", i);

Câu 6:


int i = 10;
i = i-- + ++i;
printf("%d", i);

Câu 7:


int i = 10;
i = i-- + --i;
printf("%d", i);

Câu 8:


int i = 10;
i = --i + --i;
printf("%d", i);

Câu 9:


int i = 10;
i = i-- + i--;
printf("%d", i);

Câu 10:


int i = 10;
i = --i + i--;
printf("%d", i);


Các bạn cho biết kết quả của 10 câu trên xem (không compile để xem kết quả, tự làm nha).

Hy vọng là sẽ không xảy ra sự nghi ngờ đối với kết quả thực thi của các compiler.

[QUOTE=11520537;311633]Tranh thủ topic này, mình cũng xin thỉnh giáo các bạn về 10 câu sau, đây là những câu khá là kinh điển trong C và lớp mình cũng đang “tranh đấu” vì kết quả dự đoán không như mong đợi:
Câu 1:


int i = 10;
i = ++i + ++i;
printf("%d", i);

Câu 2:


int i = 10;
i = i++ + i++;
printf("%d", i);

Câu 3:


int i = 10;
i = ++i + i++;
printf("%d", i);

Câu 4:


int i = 10;
i = i++ + ++i;
printf("%d", i);

Câu 5:


int i = 10;
i = i++ + --i;
printf("%d", i);

Câu 6:


int i = 10;
i = i-- + ++i;
printf("%d", i);

Câu 7:


int i = 10;
i = i-- + --i;
printf("%d", i);

Câu 8:


int i = 10;
i = --i + --i;
printf("%d", i);

Câu 9:


int i = 10;
i = i-- + i--;
printf("%d", i);

Câu 10:


int i = 10;
i = --i + i--;
printf("%d", i);


Các bô bạn cho biết kết quả của 10 câu trên xem (không compile để xem kết quả, tự làm nha).

Hy vọng là sẽ không sảy ra sự nghi ngờ đối với kết quả thực thi của các compiler.[/QUOTE]

Các bạn nên tự mình làm, sau đó compile để xem kết quả, rồi trở lại đây thảo luận về kết quả của mình và của compiler.

[QUOTE=11520537;311633]Tranh thủ topic này, mình cũng xin thỉnh giáo các bạn về 10 câu sau, đây là những câu khá là kinh điển trong C và lớp mình cũng đang “tranh đấu” vì kết quả dự đoán không như mong đợi:
Câu 1:


int i = 10;
i = ++i + ++i;
printf("%d", i);

Câu 2:


int i = 10;
i = i++ + i++;
printf("%d", i);

Câu 3:


int i = 10;
i = ++i + i++;
printf("%d", i);

Câu 4:


int i = 10;
i = i++ + ++i;
printf("%d", i);

Câu 5:


int i = 10;
i = i++ + --i;
printf("%d", i);

Câu 6:


int i = 10;
i = i-- + ++i;
printf("%d", i);

Câu 7:


int i = 10;
i = i-- + --i;
printf("%d", i);

Câu 8:


int i = 10;
i = --i + --i;
printf("%d", i);

Câu 9:


int i = 10;
i = i-- + i--;
printf("%d", i);

Câu 10:


int i = 10;
i = --i + i--;
printf("%d", i);


Các bô bạn cho biết kết quả của 10 câu trên xem (không compile để xem kết quả, tự làm nha).

Hy vọng là sẽ không sảy ra sự nghi ngờ đối với kết quả thực thi của các compiler.[/QUOTE]

Sử dụng phép gán lên biến i với một biểu thức có thể thay đổi giá trị của i là undefined behavior theo chuẩn C. Mỗi trình biên dịch có thể tự đưa ra kết quả khác nhau nên việc cố luận cho ra kết quả của các câu trên không có lợi ích mấy. Mấy câu này “kinh điển” theo nghĩa là đưa ra để nhắc sinh viên đừng bao giờ code như thế thì hợp hơn em ơi.

[QUOTE=truonganpn;311661]Sử dụng phép gán lên biến i với một biểu thức có thể thay đổi giá trị của i là undefined behavior theo chuẩn C. Mỗi trình biên dịch có thể tự đưa ra kết quả khác nhau nên việc cố luận cho ra kết quả của các câu trên không có lợi ích mấy. Mấy câu này “kinh điển” theo nghĩa là đưa ra để nhắc sinh viên đừng bao giờ code như thế thì hợp hơn em ơi.[/QUOTE]
Thế mà bọn em phải làm bài test với những câu như thế này đấy thầy.

Câu trả lời của mình là
Câu 1:
24

Câu 2:
22

Câu 3:
23

Câu 4:
23

Câu 5:
19

Câu 6:
21

Câu 7:
17

Câu 8:
16

Câu 9:
18

Câu 10:
17

Sẽ không có câu trả lởi chính xác cụ thể nào.

[QUOTE=11520537;311672]Thế mà bọn em phải làm bài test với những câu như thế này đấy thầy.[/QUOTE]

Thông thường, thì BTC hay GV sẽ thông tin về compiler (trình biên dịch) nào được sử dụng. Do đó không thể xảy ra sự cố như thế này.

[QUOTE=11520537;311672]Thế mà bọn em phải làm bài test với những câu như thế này đấy thầy.[/QUOTE]

Trong trường học thì mấy câu này hay xuất hiện trong test như những câu hỏi mẹo nhiều khi không có tính điểm. Không biết là em làm test gì như tui nghĩ chắc chắn những câu này chỉ chiếm một phần rất nhỏ của test đó mà thôi. Còn nếu dùng để test thật sự thì chỉ dùng trong các trường hợp kiểm tra về một trình biên dịch cụ thể. Thế nên đối với môn nhập môn lập trinh, mấy năm gần đây thì các thầy cô trong trường cũng chẳng mặn mà chi những câu đánh đố như thế này nữa. Nó giống với dạng bài toán “đầu cừu đuôi thuyền trưởng” từng tốn giấy mực của báo giới trong năm nay thôi.