30/09/2018, 19:10
Giải thích biến toàn cục và biến cục bộ trong ví dụ sau
#include <stdio.h>
#include <conio.h>
int x=9;
int main(){
int a=5, b=2;
{
int a=4;
b=a+b;
printf("a=%d b=%d x=%d",a,b,x);
printf("
");
}
printf("a=%d b=%d x=%d",a,b,x);
getch();
return 0;
}
khi chạy chương trình xuất ra 2 dòng a=4 b=6 x=9, a=5 b=6 x=9
ai giải thích giùm mình dòng printf thứ 2 đi tại sao lại ra kết quả là a=5 b=6 x=9 mà không phải là a=5 b=2 x=9. Tại sao b=6?
Bài liên quan





Tại sao
b = 6?bđược khai báo ở đầu hàmmainnên pham vi hoạt động của nó trong toàn bộ hàmmain, toàn bộ block thuộc hàmmain.Biến
bở đầu hàm main sẽ không được dùng, không thay đổi giá trị nếu:bở một block (giống biếna) trong hàmmain.bđược truyền vào 1 hàm theo giá trị (call by value).@Pham_Van_Hai
từ dòng 6 đến dòng 11 mình gọi là block đúng không? biến trong block là biến a=4(mình gọi là biến cục bộ) khi thoát khỏi block thì giá trị a sẽ chết đi, vậy tại sao biến b=6 giá trị nó không chết đi mà lại đc sử dụng bên dưới block
Đúng, đó là block.
Vì không có biến cục bộ nào cùng tên
bnào được khai báo trong block đó nên biếnbở đầu hàmmainsẽ được dùng ->bđó có nghĩa trong toàn hàmmain-> bất kỳ thay đổi gì điều được giữ nguyên -> nó chỉ mất đi khi thoát ra khỏi hàmmain.Còn trong block có một biến cục bộ cùng tên
ađược khai báo -> biếnatrong block được dùng -> vìachỉ có ý nghĩa trong block -> ra khỏi block nó bị mất đi.Trong bất ký trường hợp nào biến (nếu trùng tên) có phạm vi nhỏ nhất sẽ được dùng đầu tiên (nếu có) -> rồi đến các biến có phạm vi rộng hơn.
PS: Hạn chế dùng trùng tên biến có phạm vi khác nhau -> tránh nhầm lẫn -> gây lỗi khó tìm.
@Pham_Van_Hai như vậy là trong 1 block có biến cục bộ cùng tên a được khai báo -> khi ra khỏi block nó sẽ mất đi, do trong block không có biến cục bộ cùng tên b được khai báo nên giá trị b=6 sẽ được giữ nguyên khi thoát khỏi block
Bạn đọc lại nhiều lần trả lời trước của mình đi nhé, mình nó rất rõ ràng từng trường hợp rồi.
@Pham_Van_Hai chắc tại mình chậm tiêu tks
Theo mình hiểu là như vậy
Biên cục bộ (bình thường) là biến nằm trong 1 khối { }
Phạm vi của biến chỉ ở trong khối chứa nó, nếu có cùng tên thì khi sử dụng sẽ dụng biến nằm trong khối nhỏ nhất.
Ra khỏi khối { } biến đó không còn tác dụng
@taivh vì giá trị b trong khối {} mình chỉ gán giá trị(b=a+b) chứ không phải là khai báo (ví dụ int b=5) nên khi thoát khỏi khối {} biến đó vẫn còn tác dụng nên giá trị b sau block mới bằng 6
Mình đính chính rõ hơn là biến có hiệu lực từ khi bạn khai báo.
b nằm trong khối { } không phải là khai báo mà là chỉ là phép gán nên khi ra khỏi khối nó vẫn còn tác dụng nên printf b mới bằng 6. nếu mình khai báo biến b trong khối {} là 6 thì khi thoát khỏi khối {} thì giá trị b =6 không còn nữa, lúc này kết quả b sẽ bằng 2