Tại sao tên biến không thể bắt đầu bằng số?


136

Tôi đã làm việc với một nhà phát triển C ++ mới một thời gian trước khi anh ấy hỏi câu hỏi: "Tại sao tên biến không thể bắt đầu bằng số?"

Tôi không thể đưa ra câu trả lời ngoại trừ một số số có thể có văn bản trong đó (123456L, 123456U) và điều đó là không thể nếu các trình biên dịch nghĩ mọi thứ với một số lượng ký tự alpha là một tên biến.

Đó có phải là câu trả lời đúng? Có bất kỳ lý do nữa?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

15
Và tại sao họ không thể có không gian trong đó?
Tim

4
Vấn đề này có trước C ++ ít nhất 20 năm, nếu không quay lại các trình biên dịch macro đầu tiên.
Ken Gentle

2
Vâng, trong FORTH, bạn có thể làm điều đó. AFAIK, có một từ được gọi là 0đẩy 0 lên ngăn xếp. một cái khác là 0=kiểm tra xem 0 có trong stack không.
Ingo

12
Tại sao câu hỏi này rất phổ biến và câu trả lời rất sai? Nhiều ngôn ngữ cho phép các biến bắt đầu bằng số. C ++ không có nhưng đó chỉ là một giới hạn thuận tiện để tránh sự mơ hồ nhất định. Đôi khi SO làm tôi ngạc nhiên theo tất cả các cách sai.
david.pfx 15/03/2016

5
Nếu câu hỏi này được hỏi ngày hôm nay trên SO, nó sẽ được gọi là dựa trên ý kiến ​​và đóng. Cảm ơn đã hỏi điều này.
Boon

Câu trả lời:


116

Bởi vì sau đó một chuỗi các chữ số sẽ là một định danh hợp lệ cũng như một số hợp lệ.

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";

37
Chà, nếu họ nói các biến không thể chỉ là số. Rồi sao?
Pyrolistic

6
Tôi sẽ mất nhiều thời gian hơn để đưa ra một biểu thức thông thường cho người từ chối nhận mã định danh bằng quy tắc đó, nếu có thể, vì vậy tôi có thể hiểu tại sao không có ngôn ngữ nào được thực hiện theo cách đó, ngoài những lý do được đưa ra câu trả lời khác.
Skiphoppy

39
Nếu nó phải là số + alpha, thì bạn vẫn có thể thực hiện Chuỗi 0x123 = "Hello World". Trừ khi bạn nói rằng tên biến là "số + alpha không phân tích thành một chỉ định số hợp lệ", và điều đó thật ngớ ngẩn.
eaolson

4
Đừng bận tâm đến trình biên dịch: những người sử dụng ngôn ngữ cần có khả năng dễ dàng (trong nháy mắt) phân biệt tên biến với số. Nếu ký tự đầu tiên không cho bạn biết - thay vào đó, nếu bạn cần tìm kiếm trong phần còn lại của từ để biết nếu có một alpha không phải là số ở đâu đó trong đó - thì mã sẽ khó đọc hơn.
sắp tới

10
@eaolson: Tôi đã làm việc với một trình biên dịch chương trình áp dụng quy tắc đó cho các số hex bắt đầu bằng A- Fvà kết thúc bằng h. Lần đầu tiên gặp tôi lần đầu tiên, tôi đã cố gắng xác định nhãn để trỏ đến dữ liệu âm nhạc cho Phát minh hai phần số 13 của Bach (tên logic? Bach).
supercat

116

Hãy nghĩ về điều này:

int 2d = 42;
double a = 2d;

Là gì 2.0? hay 42?

Gợi ý, nếu bạn không hiểu, d sau một số có nghĩa là số trước đó là một chữ kép


11
Đây thực sự là một ký hiệu sắp tới [tương đối] ("d" cho "nhân đôi"), II89 tiêu chuẩn C89. Số hàng đầu trong số nhận dạng không thể có nếu cấu trúc này bằng ngôn ngữ, nhưng đó không phải là lý do số không thể bắt đầu số nhận dạng.
Ken Gentle

1
dkhông phải là một hậu tố nghĩa đen trôi nổi hợp lệ trong C ++. Chữ nổi được nhân đôi theo mặc định, bạn có thể sử dụng fhoặc lnếu bạn cần một chữ nổi hoặc chữ kép dài.
CB Bailey

1
Nó dành cho Java và trong khi câu hỏi ban đầu là dành cho C ++, thì nó cũng áp dụng cho nhiều ngôn ngữ khác, như Java. Nhưng tôi đồng ý. Đây không phải là lý do ban đầu tại sao số nhận dạng không thể bắt đầu bằng số.
Pyrolistic

50

Bây giờ nó là một quy ước, nhưng nó bắt đầu như một yêu cầu kỹ thuật.

Vào thời xưa, các trình phân tích cú pháp của các ngôn ngữ như FORTRAN hoặc BASIC không yêu cầu sử dụng khoảng trắng. Vì vậy, về cơ bản, sau đây là giống hệt nhau:

10 V1=100
20 PRINT V1

10V1=100
20PRINTV1

Bây giờ giả sử rằng tiền tố số đã được cho phép. Làm thế nào bạn sẽ giải thích điều này?

101V=100

như

10 1V = 100

hoặc như

101 V = 100

hoặc như

1 01V = 100

Vì vậy, điều này đã được thực hiện bất hợp pháp.


1
Số nit nhỏ: số dòng phải ở các cột 1-6 và mã thực thi theo cột 8. Mặt khác, DO 10 I=1,50có thể được phân tích cú pháp một cách mơ hồ là DO1 0I=1,50[tình cờ, nếu một người sử dụng dấu chấm thay vì dấu phẩy, câu lệnh trở thành gán cho biến dấu phẩy động có tên DO10I.
supercat

Giải thích thú vị! Điều đó có ý nghĩa đối với các ngôn ngữ cũ hơn, vẫn khiến tôi tự hỏi tại sao chúng tôi vẫn tiếp tục lựa chọn thiết kế cho các ngôn ngữ như Python hoặc JavaScript hoặc R.
Charles Clayton

Tôi chắc chắn nhớ điều này với BASIC và cảm thấy đây có lẽ là lý do thực tế hợp lệ nhất của thực tiễn. Về mặt kỹ thuật, tôi mơ hồ nhớ rằng nó thực sự có thể quay trở lại ngôn ngữ lắp ráp sớm. Tôi không chắc chắn những gì trình biên dịch mặc dù, và tôi rất có thể sai.
Brian Chandler

42

Bởi vì quay lui được tránh trong phân tích từ vựng trong khi biên dịch. Một biến như:

Apple;

trình biên dịch sẽ biết đó là một định danh ngay lập tức khi nó gặp chữ 'A'.

Tuy nhiên, một biến như:

123apple;

trình biên dịch sẽ không thể quyết định xem đó có phải là số hoặc số nhận dạng cho đến khi nó đạt 'a' hay không và kết quả là nó cần quay lại.


2
Để trả lời bằng cách nhớ lớp thiết kế trình biên dịch của tôi, Câu trả lời này đi thẳng ngay! Kudos
nehem

15

Trình biên dịch / trình phân tích cú pháp / trình phân tích từ vựng đã có từ lâu, đối với tôi, nhưng tôi nghĩ rằng tôi nhớ rằng có khó khăn trong việc xác định một cách rõ ràng liệu một ký tự số trong đơn vị biên dịch đại diện cho một chữ hoặc một định danh.

Các ngôn ngữ có không gian không đáng kể (như ALGOL và FORTRAN gốc nếu tôi nhớ chính xác) không thể chấp nhận các số để bắt đầu định danh vì lý do đó.

Điều này quay trở lại - trước các ký hiệu đặc biệt để biểu thị lưu trữ hoặc cơ sở số.


9

Tôi đồng ý sẽ rất hữu ích khi cho phép số nhận dạng bắt đầu bằng một chữ số. Một hoặc hai người đã đề cập rằng bạn có thể khắc phục hạn chế này bằng cách thêm một dấu gạch dưới vào số nhận dạng của mình, nhưng điều đó thực sự xấu xí.

Tôi nghĩ rằng một phần của vấn đề xuất phát từ những chữ số như 0xdeadbeef, điều này khiến cho việc đưa ra các quy tắc dễ nhớ cho các số nhận dạng có thể bắt đầu bằng một chữ số trở nên khó khăn. Một cách để làm điều đó có thể là cho phép mọi thứ khớp với [A-Za-z _] + đó KHÔNG phải là từ khóa hoặc số theo nghĩa đen. Vấn đề là nó sẽ dẫn đến những điều kỳ lạ như 0xdeadpork được cho phép, nhưng không phải là 0xdeadbeef. Cuối cùng, tôi nghĩ chúng ta nên công bằng với tất cả các loại thịt: P.

Khi tôi mới học C, tôi nhớ cảm giác quy tắc cho tên biến là tùy ý và hạn chế. Điều tồi tệ nhất là chúng rất khó nhớ, vì vậy tôi đã từ bỏ việc cố gắng học chúng. Tôi chỉ làm những gì cảm thấy đúng, và nó hoạt động khá tốt. Bây giờ tôi đã học được nhiều hơn, nó dường như không tệ lắm, và cuối cùng tôi cũng đã học được cách học đúng.


8
LOL - "Vấn đề là nó sẽ dẫn đến những điều kỳ lạ như 0xdeadpork được phép, nhưng không phải là 0xdeadbeef. Cuối cùng, tôi nghĩ chúng ta nên công bằng với tất cả các loại thịt: P."
mr-euro

6

Có thể đó là một quyết định được đưa ra vì một vài lý do, khi bạn phân tích mã thông báo, bạn chỉ cần nhìn vào ký tự đầu tiên để xác định xem đó là mã định danh hay bằng chữ và sau đó gửi nó đến đúng chức năng để xử lý. Vì vậy, đó là một tối ưu hóa hiệu suất.

Tùy chọn khác sẽ là kiểm tra xem nó không phải là một nghĩa đen và để lại miền định danh là vũ trụ trừ đi nghĩa đen. Nhưng để làm điều này, bạn sẽ phải kiểm tra mọi ký tự của mọi mã thông báo để biết cách phân loại nó.

Ngoài ra còn có các định danh hàm ý phong cách được cho là ghi nhớ nên các từ dễ nhớ hơn nhiều so với số. Khi nhiều ngôn ngữ gốc được viết ra, thiết lập các kiểu trong vài thập kỷ tiếp theo, họ không nghĩ đến việc thay thế "2" thành "thành".


6

Tên biến không thể bắt đầu bằng một chữ số, vì nó có thể gây ra một số vấn đề như dưới đây:

int a = 2;
int 2 = 5;
int c = 2 * a; 

giá trị của c là gì? là 4, hoặc là 10!

một vi dụ khac:

float 5 = 25;
float b = 5.5;

là 5 đầu tiên một số hoặc là một đối tượng (. Toán tử) Có một vấn đề tương tự với 5 thứ hai.

Có thể, có một số lý do khác. Vì vậy, chúng ta không nên sử dụng bất kỳ chữ số nào trong phần đầu của tên biến.


Ngay cả khi một yêu cầu định danh chứa ít nhất một ký tự không phải là chữ số, người ta cũng sẽ phải yêu cầu các định dạng số có chứa các chữ cái cũng phải chứa một ký tự không phải là chữ và số [ví dụ: yêu cầu 0x1234 được viết là $ 1234 và 1E6 để được viết như 1.E6 hoặc 1.0E6] hoặc người nào khác có sự kết hợp kỳ lạ giữa tên định danh hợp pháp và bất hợp pháp.
supercat

4

Việc sử dụng một chữ số để bắt đầu một tên biến khiến việc kiểm tra lỗi trong quá trình biên dịch hoặc xen kẽ trở nên phức tạp hơn rất nhiều.

Việc cho phép sử dụng các tên biến bắt đầu như một số có thể sẽ gây ra vấn đề lớn cho các nhà thiết kế ngôn ngữ. Trong quá trình phân tích mã nguồn, bất cứ khi nào trình biên dịch / trình thông dịch gặp phải mã thông báo bắt đầu bằng một chữ số có tên biến được dự kiến, nó sẽ phải tìm kiếm thông qua một bộ quy tắc lớn, phức tạp để xác định xem mã thông báo có thực sự là biến hay lỗi không . Sự phức tạp được thêm vào được thêm vào trình phân tích cú pháp ngôn ngữ có thể không chứng minh tính năng này.

Theo như tôi có thể nhớ (khoảng 40 năm), tôi không nghĩ rằng mình đã từng sử dụng một ngôn ngữ cho phép sử dụng một chữ số để bắt đầu các tên biến. Tôi chắc chắn rằng điều này đã được thực hiện ít nhất một lần. Có lẽ, ai đó ở đây đã thực sự nhìn thấy điều này ở đâu đó.


1
Nó không khó lắm đâu. Nó làm cho giai đoạn từ vựng trở nên khó khăn hơn, đó là tất cả. Tất nhiên, trở lại khi tôi lấy trình biên dịch, tôi được cho biết rằng quét từ vựng có thể chiếm hơn một phần tư tổng thời gian biên dịch.
David Thornley

4

Như nhiều người đã nhận thấy, có rất nhiều hành lý lịch sử về các định dạng hợp lệ cho tên biến. Và các nhà thiết kế ngôn ngữ luôn bị ảnh hưởng bởi những gì họ biết khi họ tạo ra ngôn ngữ mới.

Điều đó nói rằng, hầu như tất cả thời gian một ngôn ngữ không cho phép các tên biến bắt đầu bằng số là vì đó là các quy tắc của thiết kế ngôn ngữ. Thông thường đó là bởi vì một quy tắc đơn giản như vậy làm cho việc phân tích cú pháp và từ vựng của ngôn ngữ dễ dàng hơn nhiều. Tuy nhiên, không phải tất cả các nhà thiết kế ngôn ngữ đều biết đây là lý do thực sự. Các công cụ từ vựng hiện đại giúp ích, bởi vì nếu bạn cố gắng định nghĩa nó là cho phép, chúng sẽ cung cấp cho bạn các xung đột phân tích cú pháp.

OTOH, nếu ngôn ngữ của bạn có một ký tự duy nhất có thể nhận dạng với các tên biến theo huy hiệu, có thể thiết lập nó để chúng bắt đầu bằng một số. Các biến thể quy tắc tương tự cũng có thể được sử dụng để cho phép khoảng trắng trong tên biến. Nhưng ngôn ngữ kết quả có khả năng không giống với bất kỳ ngôn ngữ thông thường phổ biến nào, nếu có.

Để biết ví dụ về ngôn ngữ tạo khuôn mẫu HTML khá đơn giản cho phép các biến bắt đầu bằng số và có các khoảng trắng được nhúng, hãy xem Qompose .


1
Trên thực tế, có một số ngôn ngữ cho phép bạn có các ký tự đánh dấu định danh. Chúng được gọi là "sigils" và bạn có chúng trong Perl và PHP.
Jason Baker

Ngoại trừ bạn vẫn không được phép bắt đầu một tên biến trong PHP bằng một số - các quy tắc ngôn ngữ cấm nó. :-) Nhưng bạn có thể trong Qompose vì lý do chính xác như vậy.
staticsan

4

Bởi vì nếu bạn cho phép từ khóa và mã định danh bắt đầu bằng các ký tự số, thì từ vựng (một phần của trình biên dịch) không thể dễ dàng phân biệt giữa bắt đầu bằng chữ số và từ khóa mà không phức tạp hơn nhiều (và chậm hơn).


2
Quá trình lexing hiếm khi là nút cổ chai. Chắc chắn, nó làm cho biểu thức chính quy cho mã thông báo định danh phức tạp hơn, nhưng chúng vẫn có thể là các DFA siêu nhanh. Thời gian chạy của chúng là đậu phộng so với hầu hết các trình biên dịch tác vụ khác phải hoàn thành.

4

Sự hạn chế là tùy ý. Lisps khác nhau cho phép tên biểu tượng để bắt đầu bằng chữ số.


4

COBOL cho phép các biến bắt đầu bằng một chữ số.


2

C ++ không thể có nó bởi vì các nhà thiết kế ngôn ngữ đã biến nó thành một quy tắc. Nếu bạn tạo ngôn ngữ của riêng mình, bạn chắc chắn có thể cho phép ngôn ngữ đó, nhưng có lẽ bạn sẽ gặp phải những vấn đề tương tự họ đã làm và quyết định không cho phép ngôn ngữ đó. Ví dụ về tên biến sẽ gây ra vấn đề:

0x, 2d, 5555


Hạn chế này có trong các ngôn ngữ mà loại cú pháp đó không được phép mặc dù.
Jason Baker

2

Một trong những vấn đề chính về các quy ước cú pháp thư giãn là nó đưa ra sự bất đồng về nhận thức vào quá trình mã hóa. Cách bạn nghĩ về mã của bạn có thể bị ảnh hưởng sâu sắc bởi sự thiếu rõ ràng mà điều này sẽ giới thiệu.

Không phải Dykstra đã nói rằng "khía cạnh quan trọng nhất của bất kỳ công cụ nào là ảnh hưởng của nó đến người dùng"?


1

Có lẽ bởi vì nó giúp con người dễ dàng biết được đó là số hay định danh và vì truyền thống. Có các số nhận dạng có thể bắt đầu bằng một chữ số sẽ không làm phức tạp quá trình quét từ vựng.

Không phải tất cả các ngôn ngữ đã cấm định danh bắt đầu bằng một chữ số. Trong Forth, chúng có thể là số và các số nguyên nhỏ thường được định nghĩa là các từ Forth (về cơ bản là định danh), vì đọc "2" như một thói quen để đẩy số 2 lên ngăn xếp nhanh hơn nhận ra "2" là số có giá trị là 2. (Khi xử lý đầu vào từ lập trình viên hoặc khối đĩa, hệ thống Forth sẽ phân tách đầu vào theo khoảng trắng. Nó sẽ cố gắng tìm mã thông báo trong từ điển để xem đó có phải là một từ được xác định hay không và nếu không sẽ cố dịch nó thành một số và nếu không sẽ đánh dấu lỗi.)


Vấn đề là Forth không thực sự có một trình phân tích cú pháp rất tinh vi. Thực sự, tất cả những gì nó quan tâm là nếu một định danh nằm giữa hai bộ khoảng trắng.
Jason Baker

1

Giả sử bạn đã cho phép tên biểu tượng bắt đầu bằng số. Bây giờ giả sử bạn muốn đặt tên một biến 12345foobar. Làm thế nào bạn phân biệt điều này với 12345? Nó thực sự không quá khó để thực hiện với một biểu thức thông thường. Vấn đề thực sự là một trong những hiệu suất. Tôi thực sự không thể giải thích lý do tại sao điều này rất chi tiết, nhưng về cơ bản, nó thực sự hiểu rõ rằng việc phân biệt 12345foobar với 12345 đòi hỏi phải quay lại. Điều này làm cho biểu thức chính quy không xác định.

Có một lời giải thích tốt hơn về điều này ở đây .


1
Làm thế nào một người sẽ thiết kế một biểu thức chính quy để cho phép một biến có tên ifqhoặc doublezkhông ifhoặc doublekhông? Vấn đề cơ bản với việc cho phép số nhận dạng bắt đầu bằng chữ số là có các dạng chữ lục giác và số dấu phẩy động hiện có hoàn toàn gồm các ký tự chữ và số (các ngôn ngữ sẽ sử dụng thứ gì đó như $ 1234 hoặc h'1234 thay vì 0x1234 và yêu cầu các số như 1E23 để bao gồm một khoảng thời gian, có thể tránh vấn đề đó). Lưu ý rằng các nỗ lực phân tích lại phân tích cú pháp C có thể bị tăng gấp ba lần bởi những thứ như 0x12E+5.
supercat

1

trình biên dịch có thể dễ dàng xác định một biến bằng ASCII trên vị trí bộ nhớ thay vì số.


1

Trình biên dịch có 7 pha như sau:

  1. Phân tích từ vựng
  2. Phân tích cú pháp
  3. Phân tích ngữ nghĩa
  4. Tạo mã trung gian
  5. Tối ưu hóa mã
  6. Tạo mã
  7. Bảng biểu tượng

Quay lui được tránh trong giai đoạn phân tích từ vựng trong khi biên dịch đoạn mã. Biến như Apple, trình biên dịch sẽ biết ngay định danh của nó khi gặp ký tự 'A' trong giai đoạn Phân tích từ vựng. Tuy nhiên, một biến như 123apple, trình biên dịch sẽ không thể quyết định xem đó là số hay số nhận dạng cho đến khi nó chạm 'a' và nó cần quay lại để đi vào giai đoạn phân tích từ vựng để xác định rằng đó là biến. Nhưng nó không được hỗ trợ trong trình biên dịch.

Khi bạn phân tích mã thông báo, bạn chỉ cần nhìn vào ký tự đầu tiên để xác định xem đó là mã định danh hay bằng chữ và sau đó gửi nó đến đúng chức năng để xử lý. Vì vậy, đó là một tối ưu hóa hiệu suất.


0

Tôi nghĩ rằng câu trả lời đơn giản là nó có thể, hạn chế là dựa trên ngôn ngữ. Trong C ++ và nhiều người khác thì không thể vì ngôn ngữ không hỗ trợ nó. Nó không được xây dựng trong các quy tắc để cho phép điều đó.

Câu hỏi giống như hỏi tại sao Vua không thể di chuyển bốn không gian cùng một lúc trong Cờ vua? Đó là bởi vì trong Cờ vua đó là một nước cờ bất hợp pháp. Có thể trong một trò chơi khác chắc chắn. Nó chỉ phụ thuộc vào các quy tắc được chơi bởi.


Ngoại trừ việc C ++ được phát minh gần đây bởi những người vẫn còn sống. Chúng ta có thể hỏi họ tại sao họ chọn những việc họ đã làm và từ chối các lựa chọn thay thế. Tương tự không áp dụng cho cờ vua.
Steve Jessop

Nhưng đó không phải là điểm tôi đang làm. Nó tương tự như lý do tại sao không thể có số ở đầu tên biến và câu trả lời đơn giản nhất là bởi vì các quy tắc của ngôn ngữ không cho phép nó.
kemiller2002

Chắc chắn, nhưng tôi không nghĩ người hỏi là một người ngu ngốc. Có lẽ anh ấy đã tự mình làm việc đến nay. Câu hỏi IMO là "tại sao các quy tắc ngôn ngữ không cho phép?". Anh ta muốn thu hẹp khoảng cách giữa việc biết các quy tắc và hiểu chúng.
Steve Jessop

Vâng, khi suy nghĩ về điều này, tôi nhận ra bạn đang đi đâu. Bạn có một điểm. Tôi đoán rằng tôi đã sử dụng dao cạo của Occam một chút để tự do và cho rằng không có câu trả lời thực sự tại sao ngoại trừ các biến đó không bắt đầu bằng số, vì không có số.
kemiller2002

Tôi không nói rằng bạn sai, đôi khi, các quyết định của các cơ quan tiêu chuẩn C ++ không vượt qua sự hiểu biết sinh tử, và bạn kết thúc với "bởi vì họ phải quyết định điều gì đó và họ đã quyết định điều này". Nhưng có ít nhất một câu hỏi được đặt ra :-)
Steve Jessop

0

Ban đầu nó đơn giản là vì nó dễ nhớ hơn (bạn có thể hiểu ý nghĩa hơn) tên biến là chuỗi thay vì số mặc dù số có thể được bao gồm trong chuỗi để tăng cường ý nghĩa của chuỗi hoặc cho phép sử dụng cùng tên biến nhưng nó được chỉ định là có một ý nghĩa hoặc bối cảnh riêng biệt, nhưng gần gũi. Ví dụ loop1, loop2, v.v. sẽ luôn cho bạn biết rằng bạn đang ở trong một vòng lặp và / hoặc vòng 2 là một vòng lặp trong loop1. Bạn thích cái nào hơn (có ý nghĩa hơn) như một biến: địa chỉ hoặc 1121298? Cái nào dễ nhớ hơn? Tuy nhiên, nếu ngôn ngữ sử dụng một cái gì đó để biểu thị rằng nó không chỉ là văn bản hoặc số (chẳng hạn như địa chỉ $ in $) thì thực sự không nên tạo sự khác biệt vì điều đó sẽ cho trình biên dịch biết rằng những gì tiếp theo sẽ được coi là một biến ( trong trường hợp này).


0

Biến cũng có thể được coi là một giá trị trong thời gian biên dịch bởi trình biên dịch để giá trị có thể gọi lại giá trị một lần nữa


0

Quay lui được tránh trong giai đoạn phân tích từ vựng trong khi biên dịch đoạn mã . Biến như Apple; , trình biên dịch sẽ biết định danh của nó ngay lập tức khi gặp ký tự 'A' trong giai đoạn Phân tích từ vựng. Tuy nhiên, một biến như 123apple; , trình biên dịch sẽ không thể quyết định xem đó là số hay số nhận dạng cho đến khi nó chạm 'a' và nó cần quay lại để đi vào giai đoạn phân tích từ vựng để xác định rằng đó là một biến. Nhưng nó không được hỗ trợ trong trình biên dịch.

Tài liệu tham khảo


0

Không thể có gì sai với nó khi khai báo biến. Nhưng có một sự mơ hồ khi nó cố gắng sử dụng biến đó ở một nơi khác như thế này:

hãy để 1 = "Xin chào thế giới!" in (1) in (1)

in là một phương pháp chung chấp nhận tất cả các loại biến. Vì vậy, trong tình huống đó, trình biên dịch không biết (1) mà lập trình viên đề cập đến: 1 của giá trị nguyên hoặc 1 lưu trữ giá trị chuỗi. có thể tốt hơn cho trình biên dịch trong tình huống này để cho phép xác định một cái gì đó tương tự nhưng khi cố gắng sử dụng công cụ mơ hồ này, hãy mang một lỗi với khả năng sửa lỗi để làm thế nào để sửa lỗi đó và xóa sự mơ hồ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.