DOUG LLOYD: Khi bạn bắt đầu làm việc với chức năng,
điều khác là sẽ trở thành thực sự quan trọng để hiểu,
đó là khái niệm về phạm vi biến.
Vì vậy, phạm vi là một đặc trưng của một biến
định nghĩa từ đó chức năng biến có thể được truy cập.
>> Có hai lĩnh vực chính trong C, biến cục bộ và biến toàn cầu.
Bây giờ, các biến địa phương chỉ có thể được truy cập trong chức năng
trong đó họ đang tạo ra.
Họ không thể được truy cập bởi tất cả các khác chức năng tồn tại trong chương trình của bạn,
chỉ có chức năng trong mà nó được tạo ra.
Biến toàn cầu, trên Mặt khác, có thể được truy cập
bởi bất kỳ chức năng trong chương trình.
Và lý do cho điều đó là bởi vì họ không tạo ra bên trong
của bất kỳ chức năng cụ thể.
Chúng tôi tuyên bố họ bên ngoài của tất cả các chức năng, trong đó
có nghĩa là mọi chức năng biết nơi nó là gì và có thể truy cập và thao tác nó.
>> Vì vậy, đến nay trong khóa học, bạn đã khá nhiều được làm việc độc quyền
với các biến địa phương.
Dưới đây là một ví dụ về một rất, rất Chức năng chính đơn giản và rất đơn giản
chức năng bổ sung mà chúng tôi đã viết.
Trong trường hợp này, x, mà Tôi đã có màu xanh chỉ
để làm nổi bật các địa phương hoặc phạm vi của biến đó,
là địa phương đến ba chức năng.
chính không thể tham khảo x cả.
Nó không biết nó là gì.
Không có chức năng khác, trên thực tế, nếu chúng ta có chức năng bổ sung ở đây,
có thể tham khảo để x.
>> Tương tự như vậy, kết quả mà tôi đã màu xanh, là địa phương duy nhất để chính.
Chỉ biết những gì chính kết quả biến được.
ba không thể sử dụng nó.
>> Bây giờ như tôi đã đề cập, biến toàn cầu không tồn tại.
Nếu bạn khai báo biến đó bên ngoài của bất kỳ chức năng,
tất cả các chức năng trong Chương trình có thể đề cập đến nó.
Vì vậy, trong trường hợp này tôi đã nhấn mạnh trong màu xanh lá cây một khai báo biến toàn cầu.
Trong trường hợp này, nhiều biến tuyên bố
được gọi là toàn cầu, chỉ để là cực kỳ rõ ràng về nó.
Đó là kiểu float.
Và tôi gán cho nó giá trị 0,5050.
>> Bạn sẽ nhận thấy rằng trong chính và trong ba, tôi có thể tham khảo toàn cầu.
Và trên thực tế, nếu tôi đi qua các chương trình như được chỉ ra, cuộc gọi chính đầu tiên ba,
nhân lên gấp ba lần toàn cầu bằng 3, đặt giá trị của nó đến 1,5-một cái gì đó,
1,51 hoặc một cái gì đó như thế, và sau đó chính cũng in ra giá trị
của toàn cầu.
Vì vậy, chính sẽ không in ra 0,5050, nó sẽ in ra toàn cầu 3 lần, 1,51.
Vì vậy, bạn phải cẩn thận khi bạn đang làm việc với các biến toàn cầu.
Trong khi họ đang rất linh hoạt trong việc có thể để vượt qua thông tin
xung quanh sao cho mỗi chức năng có thể sử dụng nó,
nó cũng có thể có một số hậu quả nguy hiểm
nếu thay đổi một chức năng giá trị của một biến
trước khi bạn mong đợi nó phải được thay đổi.
>> Tại sao sự phân biệt này có vấn đề?
Tại sao chúng ta quan tâm là một số biến là địa phương và những người khác là toàn cầu?
Vâng, đối với hầu hết các phần, các biến địa phương trong C là những gì được gọi là truyền theo giá trị
khi chúng tôi thực hiện một cuộc gọi chức năng.
Điều đó có nghĩa là gì?
>> Vâng, khi một biến được thông qua theo giá trị, các callee, mà
là một cách khác để nói rằng các chức năng đó là nhận biến mà
được thông qua tại như một đầu vào, nó thực sự không nhận được rằng biến đó.
Nó nhận riêng của mình bản sao của nó để làm việc với.
Đây là một sự phân biệt thực sự quan trọng.
Chúng tôi chỉ thấy một giây trước rằng với các biến toàn cầu,
nếu chúng ta thao tác toàn cầu biến trong một chức năng, tác dụng
trong đó một chức năng mang thông qua để mọi chức năng khác.
>> Nhưng với các biến địa phương, Đo không phải sự thật.
Mỗi chức năng khi nó nhận các biến như là đầu vào
nhận được bản sao của các biến, không biến bản thân.
Vì vậy, các tác dụng phụ của việc đó là gì?
Điều đó có nghĩa là các biến trong người gọi, các chức năng mà
là làm cho các cuộc gọi chức năng, là không thay đổi trừ khi bạn ghi đè lên nó.
>> Ví dụ, trong mã này foo là không thay đổi ở tất cả.
Int foo bằng 4, gọi ba của foo, bên trong của ba,
chúng ta mong đợi rằng sẽ foo được nhân với 3 và trở về,
nhưng có thực sự là không có hiệu lực.
>> Ở đây mặc dù, một sự khác biệt rất tinh tế.
Điều này không có hiệu ứng chúng ta muốn.
Bạn có thấy lý do tại sao?
Chúng tôi đang trọng foo trong chính thời gian này.
>> Vì vậy, int foo bằng 4, foo bằng triple foo, khi chúng ta thực hiện cuộc gọi,
triple được bản sao của chính nó của foo, bản sao của chính nó 4.
Nó nói trả lại 4 lần 3, hoặc bất cứ điều gì biến được thông qua trong thời gian 3.
Và sau đó chúng ta gán trở lại giá trị của ba để foo một lần nữa.
Vì vậy, đây thực sự sẽ ghi đè lên foo.
Đây là cách duy nhất để làm này với biến địa phương.
Vì vậy, bây giờ nếu chúng ta thêm một dòng mã ở đây
vào cuối chính in ra giá trị của foo,
nó sẽ trong thực tế in ra 12.
>> Phạm vi biến nói chung là không quá nhiều của một vấn đề
nếu bạn đặt tên cho tất cả các bạn biến những thứ khác nhau.
Nhưng nó có thể có được loại khó chịu nếu tên biến giống nhau
xuất hiện trong nhiều chức năng, mà sẽ xảy ra rất nhiều.
Nếu bạn từng làm việc trong thế giới thực nơi
bạn đang làm việc cộng tác chương trình và mọi người trong đội khác nhau
đang làm việc cùng nhau để viết cùng chương trình hay cùng một bộ các chương trình,
họ sẽ thường xuyên tái sử dụng biến tên, những người đặc biệt phổ biến
như x, y, i, j, và như vậy.
>> Nhưng khi các biến có cùng tên, vấn đề phạm vi
có thể có được một chút phức tạp hơn để phân tích.
Ví dụ, bạn có biết những gì sẽ được in ra
ở phần cuối của chương trình đặc biệt này?
Hãy dành một phút.
Tạm dừng video và đọc thông qua chương trình này.
Bạn có thể nhìn thấy ở chúng tôi đầu có chức năng khai báo
cho một chức năng gọi là thặng dư.
Chức năng mà phải mất một đơn tham số, một số nguyên mà chúng ta gọi là x.
Và nó ra một số nguyên.
Đó là kiểu trả về lúc đầu.
>> Sau đó, chúng tôi có chính, một vài dòng các mã trong chính, người cuối cùng trong số đó
là một tuyên bố in.
Và hãy nhớ, đó là câu hỏi ở đây.
Điều gì đang thực sự đi vào được in ở cuối của chức năng này?
Và sau đó, chúng tôi thực sự có định nghĩa của increment dưới đây.
>> Vì vậy, hãy dành một phút, bước qua mã, theo dõi những điều trên.
Bạn có biết những gì sẽ được in ở Kết thúc chương trình đặc biệt này?
>> Được rồi.
Hy vọng rằng, bạn đã lấy một vài giây để thử và phân tích này ra ngoài.
Hãy làm điều đó với nhau.
>> Vì vậy, tôi đã vượt qua ra thặng dư của khai báo ở trên cùng đó.
Nó là một loại phân tâm.
Nó không biến riêng của mình.
Nó không có phạm vi riêng của mình.
Nó chỉ là một chức năng kê khai, do đó, cho các mục đích
cố gắng để phân tích ra gì xảy ra trong chương trình này,
chúng ta cũng có thể chỉ cần tránh nó.
>> Bây giờ chúng tôi có trong trường hợp này, Lý do vấn đề này là khó khăn
là bởi vì chúng tôi có các biến địa phương trong cả chính và thặng dư, mỗi trong số đó
được gọi là x.
Và tất nhiên mấu chốt của vấn đề này là cố gắng để Suss ra mà x được thay đổi
và làm thế nào nó có được thay đổi.
Vì vậy, tôi đã nhuộm màu mọi trường hợp của x mà là địa phương đến đỏ chính.
Và tôi đã có màu mỗi thể hiện của x đó là địa phương để tăng màu xanh.
>> Lưu ý trong đó dòng thứ ba của chính, y bằng increment
x, thặng dư mà không được thông qua x chính, hoặc màu đỏ x.
Nó nhận được thông qua một bản sao của nó.
Và nó chỉ đi làm việc với rằng bản sao của nó, màu xanh x.
Nếu bạn là toán học nghiêng, có lẽ bạn
thay vào đó nghĩ về điều này như x sub m cho chính và phụ x i cho thặng dư.
Nhưng đó là ý tưởng tương tự.
x sub m, hoặc màu đỏ x của trong slide trước đó,
là các biến đó là local-- là thể hiện của x đúng hơn là
là địa phương để chính, và phụ x i, hoặc biến màu xanh trong slide trước,
là các trường hợp của x mà là địa phương để tăng.
>> Vì vậy, là bạn có thể tìm ra những gì Chức năng này được in ở cuối?
Tôi Doug Lloyd, và điều này là CS50.