Tôi đã nghe (có thể là từ một giáo viên) rằng người ta nên khai báo tất cả các biến ở đầu chương trình / hàm và việc khai báo các biến mới trong số các câu lệnh có thể gây ra vấn đề.
Nhưng sau đó tôi đang đọc K&R và tôi bắt gặp câu này: "Các khai báo của các biến (bao gồm cả khởi tạo) có thể theo sau dấu ngoặc nhọn bên trái giới thiệu bất kỳ câu lệnh ghép nào, không chỉ câu lệnh bắt đầu một hàm". Anh ấy làm theo một ví dụ:
if (n > 0){
int i;
for (i=0;i<n;i++)
...
}
Tôi đã chơi một chút với khái niệm này, và nó hoạt động ngay cả với các mảng. Ví dụ:
int main(){
int x = 0 ;
while (x<10){
if (x>5){
int y[x];
y[0] = 10;
printf("%d %d\n",y[0],y[4]);
}
x++;
}
}
Vậy chính xác khi nào tôi không được phép khai báo biến? Ví dụ, nếu khai báo biến của tôi không nằm ngay sau dấu ngoặc nhọn mở thì sao? Như đây:
int main(){
int x = 10;
x++;
printf("%d\n",x);
int z = 6;
printf("%d\n",z);
}
Điều này có thể gây ra sự cố tùy thuộc vào chương trình / máy không?
gcc
là khá lỏng lẻo. Bạn đang sử dụng mảng và khai báo có độ dài thay đổi c99. Biên dịch vớigcc -std=c89 -pedantic
và bạn sẽ bị la. Tuy nhiên, theo c99, tất cả đó là kosher.