[Powered by Google Translate] DAVID DICIURCIO: Vì vậy, một khái niệm quan trọng để nắm bắt lập trình là khái niệm về phạm vi. Phạm vi có thể được định nghĩa là bối cảnh trong đó một biến là nhìn thấy hoặc truy cập được. Ví dụ, giả sử chúng ta có một chức năng, chính, đó là vụ để tăng một biến, x, 1-2. Như chúng ta có thể thấy, chính khởi tạo x 1, in ra một số văn bản, sau đó chạy tăng chức năng, trước khi in nhiều văn bản hơn. Nếu chức năng này để chạy một cách chính xác, nó sẽ in ra x là 2. Hãy thử lại nó. Vì vậy, như bạn có thể thấy, chính không làm những gì chúng tôi dự kiến ​​sẽ. Nó trả về giá trị 1, thay hơn 2, chúng tôi mong đợi. Lý do cho lỗi này có thể được giải thích bởi phạm vi. Trong chức năng, chính, chúng ta khởi tạo x chỉ trong phạm vi chức năng. Nói cách khác, biến x được khai báo tại địa phương trong chức năng, chính, và không thể truy cập ngoài chức năng. Chỉ có chính có thể truy cập x trong tình huống này. Khi chúng ta gọi tăng chúng tôi không vượt qua x như đầu vào, nhưng chỉ đơn thuần là một bản sao của x. Như một kết quả của điều này, việc tăng chức năng chỉ cho biết thêm giá trị 1 một bản sao của giá trị của x. Nhưng không phải X chính nó. Khi chúng tôi trở về chính, x chính nó đã không thay đổi ở tất cả. Vì vậy, in ra x sẽ chỉ mang lại giá trị là 1. Vâng, sau đó rời khỏi câu hỏi: làm thế nào chúng ta nên sửa chữa chức năng này? Một trong những giải pháp là có thặng dư trả về một giá trị. Bằng cách này, việc tăng chức năng cung cấp cho chúng tôi trở lại một số nguyên. Vì vậy, đây là mã sửa đổi của chúng tôi với chức năng thay thế tăng. Ở đây, chúng tôi thay vì trả lại x + 1, thay vì chỉ cuối với x là bằng x + 1. Ngoài ra, phải nhận thấy rằng chúng tôi thay thế đầu ra của tăng, trước đây làm mất hiệu lực, với int, nói rằng tăng sẽ vượt qua trở lại một giá trị số nguyên. Bây giờ, sau khi chạy tăng, nó sẽ trở lại với một giá trị 2, chính xác như chúng tôi dự định. Một tình huống khác chứng minh tầm quan trọng của phạm vi của là ở scopeloop.c. Trong đoạn mã này, chúng tôi có một vòng lặp for trong đó biến tổng số được khởi tạo trong quá trình từng bước. Thật không may, mã này không biên dịch. Điều này là bởi vì tổng biến thực sự không tồn tại bên ngoài vòng lặp for. Biến tuyên bố trong vòng chỉ tồn tại trong vòng lặp chính nó và được thể hiện trong lỗi của chúng tôi tổng số tin nhắn, không khai báo. Tổng số biến chưa được khai báo trong phạm vi các chức năng chính. Hơn nữa, trong mỗi lần lặp của vòng lặp cho chúng tôi, chúng tôi reinitializing tổng số 0. Này tự nó không giữ mã biên dịch, nhưng nó sẽ ngăn chặn tổng cộng từ bao giờ tổng hợp một giá trị quá khứ 1. Một lần nữa, cách tốt nhất để sửa lỗi này là gì? Một trong những phương pháp dễ dàng hơn bao gồm tổng số địa phương chức năng, chính, chứ không phải là vòng lặp chính nó. Điều này sẽ tổng số để thực sự tăng, và cuối cùng, cho phép nó được in sau khi cho vòng lặp. Một kỹ thuật mà tôi sẽ tóm tắt ngắn gọn là việc sử dụng các biến toàn cầu. Biến toàn cầu là các biến được khai báo trước khi chính duy trì giá trị của họ trong suốt toàn bộ chương trình. Tất nhiên, chức năng này có thể thay đổi giá trị của một toàn cầu, nhưng họ không đi ra khỏi phạm vi giống như các biến địa phương. Tuy nhiên, bằng cách sử dụng các biến toàn cầu có xu hướng được cau mày theo như thiết kế xấu, kể từ khi có những cách tốt hơn chia sẻ dữ liệu giữa các chức năng. Ví dụ, bằng cách sử dụng con trỏ. Nhưng nhiều hơn về thời gian khác. Cuối cùng, điều quan trọng là phải có một sự hiểu biết về phạm vi trong bối cảnh của bộ nhớ của máy tính, hoặc RAM. Khi chúng tôi thực hiện một chương trình, các biến địa phương và các chức năng được thêm vào một vị trí cụ thể trong RAM được gọi là ngăn xếp. Như các chức năng trở lại, các khung stack của các biến hiệu quả ra khỏi ngăn xếp giải phóng bộ nhớ nhiều hơn nữa. Vì vậy, khi xem xét phạm vi, chắc chắn rằng bạn nhớ ba điểm chính. Một, phạm vi có thể được, hoặc địa phương hoặc toàn cầu. Nó phụ thuộc vào nơi mà biến được khai báo. Thứ hai, các biến khai báo hoặc khởi tạo trong các chức năng địa phương để chức năng đó và không thể được thay đổi bằng cách khác chức năng, ít nhất là không mà không cần sử dụng con trỏ. Cuối cùng, các biến địa phương vòng được khai báo bên trong. Các biến không thể truy cập bên ngoài vòng lặp. Đó là tất cả về phạm vi. Cảm ơn bạn đã cho xem.