Riêng C/C++ ông nào bảo "do syntax của ngôn ngữ", "ngôn ngữ nó cho như thế". Thực tế là nói càng. Chính tư tưởng này mà các bố coder chắc chắn sẽ ẩu, cả một project tầm cỡ vài trăm ngàn code mà các bố có tư tưởng "biến trùng tên do ngôn ngữ nó cho phép thế" là up bô cho thằng maintain.
Để tránh tư tưởng nhầm lẫn tai hại này mà C++ nó phải đặt hẳn ra một rule mang tên: One Definition Rule
https://en.wikipedia.org/wiki/One_Definition_Rule .Đại ý của luật này là một identifier (định danh) chỉ có duy nhất một definition.
Còn vấn đề trong một chương trình C++ mà 2 biến trùng nhau chương trình vẫn chạy hợp lệ lý do đơn giản: Đây là nguyên tắc scopes trong khoa học máy tính nói chung rồi.
Link wiki đàng hoàng:
https://en.wikipedia.org/wiki/Scope_(computer_science)#:~:text=In computer programming, the scope,to refer to the entity.
Nghĩa là một thực thể sẽ được binding với một scope. Vì là nguyên tắc chung của ngành khoa học máy tính, nghĩa là nguyên tắc này nó hình thành từ thuở mà người ta còn phải viết các chương trình bằng Assembly. Nguyên lý scope đã được chứng minh như một tiên đề trong ngành lập trình, thế nên các ngôn ngữ được hình thành sau này dựa theo đấy để hình thành nên bộ quy tắc biên/thông dịch.
Không có ngôn ngữ hay syntax nào lại đi "cho phép" trùng tên biến cả. Mà là do cơ chế scope trong ngành khoa học máy tính nó cho phép thế. Và người ta (những cá nhân, tổ chức) tạo ra các ngôn ngữ lập trình như C/C++ chẳng hạn họ còn phải tạo ra cơ chế Forward Declaration, Namespace, resolution operator... để lập trình viên quản lý các trình tự, phạm vi của các biến, hàm, class.. etc. Để ngăn chặn tư tưởng sử dụng nguyên tắc scope của các lập trình viên một cách ẩu thả bừa bãi.
Ví dụ luôn: Như này là một bug chết người này
C++:
#include<iostream>
using namespace std;
// Global x
int x = 0;
int main()
{
// Local x
int x = 10;
cout << "Value of global x is " << x; // 10
cout<< "\nValue of local x is " << x; // 10
return 0;
}
Còn thế này thì chuẩn cơm mẹ nấu. À mà cũng k nên lạm dụng vì khi viết cỡ 1000-2000 dòng code, tầm vài chục biến trùng tên. Tôi là tôi thề thế éo nào cũng có lúc quên mẹ nó đánh "::" một vài biến. Khác éo gì làm văn viết 2 trang giấy cũng có vài đoạn quên mẹ nó éo chấm câu đâu.
C++:
#include<iostream>
using namespace std;
// Global x
int x = 0;
int main()
{
// Local x
int x = 10;
cout << "Value of global x is " << ::x; // 0
cout<< "\nValue of local x is " << x; // 10
return 0;
}
Mà tôi đi làm gặp không ít bug của mấy thằng "ngôn ngữ nó cho phép thế" đặt tên biến trùng tên nhưng đếch hiểu bản chất để mà làm cho chuẩn. Chỉnh chúng nó thì gân cổ lên "Ơ em vẫn làm thế mà, syntax nó có sai đâu nhỉ...vẫn compile ổn". Rất là mệt mỏi, tôi chỉ cố làm vài năm nữa là nghỉ dev thôi chứ tôi sợ ngành này lắm rồi.