2012-03-29 38 views
5

thể trùng lặp:
Why do I see strange values when I print uninitialized variables?
Fun with uninitialized variables and compiler (GCC)Sự mâu thuẫn trong biến boolean uninitialized

Tôi muốn biết về một vấn đề bí ẩn mà tôi phải đối mặt trong khi giải quyết các vấn đề về mã.

Mã hiện diện trong quá trình sản xuất có biến boolean chưa được khởi tạo và thư viện đang kiểm tra giá trị của boolean này. Trong trang TRỰC TIẾP, biến này hoạt động như TRUE luôn Cùng một mã trong môi trường phát triển hoạt động như FALSE luôn.

Tôi biết, do sự khác biệt về môi trường giữa SỐ & DEV, biến bool chưa được khởi tạo có thể có giá trị không xác định.

Nhưng đây là vấn đề của tôi.

Nếu tôi đặt câu lệnh đăng nhập vào mã, biên dịch và đặt nhị phân trong môi trường phát triển, biến bool có TRUE luôn, trong khi FALSE có mã trong LIVE.

Tuyên bố nhật ký ảnh hưởng như thế nào đến giá trị của biến bool chưa được khởi tạo? Tôi muốn biết các khả năng.

+2

thể trùng lặp của http://stackoverflow.com/questions/4879045/fun-with-uninitialized-variables-and-compiler-gcc http://stackoverflow.com/questions/2154132/printing-an-uninitialized -bool-using-cout-c – Kasma

Trả lời

14

Biến uninitialiazed chỉ là một phần của bộ nhớ thô và sẽ hiển thị dưới dạng giá trị bất kỳ điều gì xảy ra ở đó. Bạn nghĩ rằng "Trong hệ thống sống nó luôn luôn xảy ra là đúng" là hoàn toàn sai. Tất cả những gì bạn có thể nói là mỗi khi bạn quan sát nó trong hệ thống trực tiếp, nó có vẻ đúng. Có thể vào thứ ba tới thay vào đó nó sẽ xảy ra là sai bởi vì nó cũng được biết rằng bools uninitialized ghét ngày thứ ba. Lưu ý rằng thậm chí hoàn toàn có thể là một boolean chưa được khởi tạo có vẻ đúng với một hàm và sai cho một hàm khác (thường là một byte đầy đủ được phân bổ cho một bool, nhưng chỉ cần một bit để biểu diễn giá trị: có thể là chưa được khởi tạo bool sẽ chứa một giá trị bool ma thuật mờ mà nó đúng cho một ai đó và sai cho người khác).Đối với những gì tiêu chuẩn nói rằng truy cập một biến chưa được khởi tạo để đọc có thể là hành vi không xác định, không có giới hạn về những gì có thể xảy ra bao gồm cả sự cố (và ví dụ là dễ dàng để có một chương trình "dừng" khi đọc một biến chưa được khởi tạo , chỉ cần biên dịch với một công cụ cụ thể để theo dõi loại vấn đề này). Luôn luôn có một sự cố chương trình truy cập vào một biến chưa được khởi tạo sẽ là tuyệt vời, nhưng tiếc là nó khá tốn kém trên CPU hiện tại và nó sẽ không xảy ra trừ khi các công cụ cụ thể được sử dụng.

Tất nhiên việc thêm ngay cả chỉ một cuộc gọi printf có thể thay đổi hành vi rõ ràng của mã xử lý các biến chưa được khởi tạo. Loại lỗi này thường được gọi là "heisenbug" và thực sự là hành vi ngẫu nhiên hoặc heisenbug thường là dấu hiệu của biến chưa được khởi tạo hoặc vấn đề đồng bộ hóa luồng.

+1

upvoted chỉ cho "nó cũng được biết rằng bools uninitialized ghét thứ ba" – dberm22

2

Bạn nói:

một biến bool uninitialized có thể có một giá trị không xác định.

Thực tế, đó phải là: "biến bool chưa được khởi tạo luôn có giá trị không xác định."

Chỉ vì giá trị của bạn đang thay đổi không thay đổi thực tế là nó không được xác định. Bảo đảm duy nhất trong hành vi là những gì được xác định bởi các thông số kỹ thuật. Miễn là nó không được định nghĩa với định nghĩa lưu trữ tĩnh, hành vi chính xác là: undefined. Trình biên dịch được tự do làm bất cứ điều gì nó muốn với biến này - nó có thể khởi tạo nó, nó có thể không, nó có thể tối ưu hóa nó hoàn toàn nếu nó không được ghi lại (ví dụ: đã sử dụng), v.v.

Về cơ bản, bạn cần khởi tạo bool của bạn một cách chính xác, và bạn không thể lo lắng về nó.

+0

Tôi biết nó luôn luôn không xác định. Nhưng tôi muốn biết tại sao một sự thay đổi nhỏ có thể ảnh hưởng đến giá trị của nó. Nó luôn luôn sai trong môi trường dev, cho đến khi tôi làm một thay đổi nhỏ và biên dịch lại. – cppcoder

+0

Đó là * không xác định *. * Mọi thứ * bạn có thể làm cho trình biên dịch tạo ra một chương trình với các kết quả khác nhau và không nhất thiết phải có lý do rõ ràng nào cả. –

Các vấn đề liên quan