Cho dù trong C hay C ++, tôi nghĩ rằng chương trình bất hợp pháp này, có hành vi theo tiêu chuẩn C hoặc C ++ là không xác định, rất thú vị:
#include <stdio.h>
int foo() {
int a;
const int b = a;
a = 555;
return b;
}
void bar() {
int x = 123;
int y = 456;
}
int main() {
bar();
const int n1 = foo();
const int n2 = foo();
const int n3 = foo();
printf("%d %d %d\n", n1, n2, n3);
return 0;
}
Đầu ra trên máy của tôi (sau khi biên dịch mà không tối ưu hóa):
123 555 555
Tôi nghĩ rằng chương trình bất hợp pháp này rất thú vị vì nó minh họa cơ chế ngăn xếp, bởi vì lý do chính là người ta sử dụng C hoặc C ++ (thay vì nói, Java) là để lập trình gần với phần cứng, gần với cơ chế ngăn xếp và tương tự.
Tuy nhiên, trên StackOverflow, khi mã của người hỏi vô tình đọc từ bộ lưu trữ chưa được khởi tạo, các câu trả lời được nâng cấp mạnh mẽ nhất luôn trích dẫn tiêu chuẩn C hoặc C ++ (đặc biệt là C ++) cho hiệu ứng mà hành vi không được xác định. Tất nhiên, điều này đúng, theo như tiêu chuẩn, thì hành vi thực sự không xác định được, nhưng điều gây tò mò là các câu trả lời thay thế, từ góc độ phần cứng hoặc cơ học, để điều tra lý do tại sao một hành vi không xác định cụ thể (chẳng hạn như đầu ra ở trên) có thể đã xảy ra, rất hiếm và có xu hướng bị bỏ qua.
Tôi thậm chí còn nhớ một câu trả lời cho rằng hành vi không xác định có thể bao gồm việc định dạng lại ổ cứng của tôi. Tôi đã không lo lắng quá nhiều về điều đó, mặc dù, trước khi chạy chương trình trên.
Câu hỏi của tôi là: Tại sao việc dạy độc giả chỉ quan trọng hơn là hành vi không được xác định trong C hoặc C ++, hơn là hiểu hành vi không xác định? Ý tôi là, nếu người đọc hiểu hành vi không xác định, thì anh ta sẽ không có khả năng tránh nó chứ?
Giáo dục của tôi xảy ra là trong kỹ thuật điện, và tôi làm việc như một kỹ sư xây dựng-xây dựng, và lần cuối cùng tôi đã có một công việc như một lập trình viên cho mỗi gia nhập là 1994, do đó, tôi tò mò muốn hiểu quan điểm của người sử dụng với truyền thống hơn, nền tảng phát triển phần mềm gần đây.