Bạn đã gắn thẻ câu hỏi C và C ++ của mình cùng một lúc, trong khi câu trả lời khác nhau đáng kể trong các ngôn ngữ này.
Thứ nhất, từ ngữ của tiêu đề câu hỏi của bạn là không chính xác (hoặc chính xác hơn là không liên quan đến chính câu hỏi). Trong cả hai ví dụ của bạn, biến được khai báo và định nghĩa đồng thời, trong một dòng. Sự khác biệt giữa các ví dụ của bạn là trong lần đầu tiên, các biến được để lại chưa được khởi tạo hoặc khởi tạo với giá trị giả và sau đó nó được gán một giá trị có ý nghĩa sau đó. Trong ví dụ thứ hai, các biến được khởi tạo ngay lập tức.
Thứ hai, trong ngôn ngữ C ++, như @nightcracker lưu ý trong câu trả lời của ông, hai cấu trúc này khác nhau về mặt ngữ nghĩa. Cái đầu tiên dựa vào khởi tạo trong khi cái thứ hai - trên bài tập. Trong C ++, các hoạt động này là quá tải và do đó có thể dẫn đến các kết quả khác nhau (mặc dù người ta có thể lưu ý rằng việc tạo ra quá tải không tương đương của khởi tạo và gán không phải là một ý tưởng hay).
Trong ngôn ngữ C tiêu chuẩn ban đầu (C89 / 90), việc khai báo các biến ở giữa khối là bất hợp pháp, đó là lý do tại sao bạn có thể thấy các biến được khai báo chưa được khởi tạo (hoặc khởi tạo với các giá trị giả) ở đầu khối và sau đó được gán có ý nghĩa giá trị sau này, khi những giá trị có ý nghĩa trở nên có sẵn.
Trong ngôn ngữ C99, bạn có thể khai báo các biến ở giữa khối (giống như trong C ++), điều đó có nghĩa là cách tiếp cận đầu tiên chỉ cần thiết trong một số trường hợp cụ thể khi không biết trình khởi tạo tại điểm khai báo. (Điều này cũng áp dụng cho C ++).