Tại sao x == (x = y) không giống với (x = y) == x?


207

Hãy xem xét ví dụ sau:

class Quirky {
    public static void main(String[] args) {
        int x = 1;
        int y = 3;

        System.out.println(x == (x = y)); // false
        x = 1; // reset
        System.out.println((x = y) == x); // true
     }
}

Tôi không chắc chắn nếu có một mục trong Đặc tả ngôn ngữ Java chỉ ra việc tải giá trị trước đó của một biến để so sánh với bên phải (x = y ), theo thứ tự được ngụ ý bởi dấu ngoặc, nên được tính toán trước.

Tại sao biểu thức thứ nhất đánh giá false, nhưng biểu thức thứ hai đánh giá true? Tôi đã dự kiến ​​sẽ (x = y)được đánh giá đầu tiên, và sau đó nó sẽ so sánh xvới chính nó ( 3) và trả về true.


Câu hỏi này khác với thứ tự đánh giá các biểu hiện phụ trong một biểu thức Java ở đó xchắc chắn không phải là một 'biểu hiện phụ' ở đây. Nó cần được tải để so sánh chứ không phải là 'đánh giá'. Câu hỏi là đặc thù của Java và biểu thức x == (x = y), không giống như các cấu trúc không thực tế có tầm nhìn xa thường được tạo ra cho các câu hỏi phỏng vấn khó, đến từ một dự án thực tế. Nó được cho là một thay thế một dòng cho thành ngữ so sánh và thay thế

int oldX = x;
x = y;
return oldX == y;

trong đó, thậm chí đơn giản hơn so với lệnh x86 CMPXCHG, xứng đáng có một biểu thức ngắn hơn trong Java.


62
Phía bên tay trái luôn được đánh giá trước phía bên tay phải. Dấu ngoặc không tạo ra sự khác biệt cho điều đó.
Louis Wasserman

11
Đánh giá biểu thức x = ychắc chắn có liên quan và gây ra hiệu ứng phụ xđược đặt thành giá trị của y.
Louis Wasserman

50
Làm cho bản thân và đồng đội của bạn một ân huệ và không trộn lẫn đột biến trạng thái vào cùng một dòng như kiểm tra nhà nước. Làm như vậy sẽ làm giảm đáng kể khả năng đọc mã của bạn. (Có một số trường hợp thực sự cần thiết vì yêu cầu nguyên tử, nhưng các chức năng cho những thứ đã tồn tại và mục đích của chúng sẽ được nhận ra ngay lập tức.)
jpmc26

50
Câu hỏi thực sự là tại sao bạn muốn viết mã như thế này.
klutt

26
Chìa khóa cho câu hỏi của bạn là niềm tin sai lầm của bạn rằng dấu ngoặc đơn ngụ ý thứ tự đánh giá. Đó là một niềm tin phổ biến vì cách chúng ta dạy toán ở trường tiểu học và bởi vì một số sách lập trình cho người mới bắt đầu vẫn hiểu sai , nhưng đó là một niềm tin sai lầm. Đây là một câu hỏi khá thường xuyên. Bạn có thể được hưởng lợi từ việc đọc các bài viết của tôi về chủ đề này; chúng là về C # nhưng chúng áp dụng cho Java: ericlippert.com/2008/05/23/precedence-vs-associativity-vs-order ericlippert.com/2009/08/10/precedence-vs-order-redux
Eric Lippert

Câu trả lời:


97

trong đó, theo thứ tự ngụ ý trong ngoặc, nên được tính toán trước

Không. Đó là một quan niệm sai lầm phổ biến rằng dấu ngoặc đơn có bất kỳ ảnh hưởng (chung) nào đến thứ tự tính toán hoặc đánh giá. Họ chỉ ép các phần biểu thức của bạn vào một cây cụ thể, ràng buộc các toán hạng bên phải với các hoạt động đúng cho công việc.

(Và, nếu bạn không sử dụng chúng, thông tin này xuất phát từ "quyền ưu tiên" và tính kết hợp của các toán tử, một cái gì đó là kết quả của cách cây cú pháp được xác định. Trên thực tế, đây vẫn chính xác là cách nó hoạt động khi bạn sử dụng dấu ngoặc đơn, nhưng chúng tôi đơn giản hóa và nói rằng chúng tôi không dựa vào bất kỳ quy tắc ưu tiên nào sau đó.)

Khi đã xong (tức là khi mã của bạn đã được phân tích cú pháp vào chương trình), các toán hạng đó vẫn cần được đánh giá và có các quy tắc riêng về cách thực hiện: các quy tắc đã nói (như Andrew đã chỉ cho chúng tôi) nói rằng LHS của mỗi hoạt động được đánh giá đầu tiên trong Java.

Lưu ý rằng đây không phải là trường hợp trong tất cả các ngôn ngữ; ví dụ, trong C ++, trừ khi bạn đang sử dụng toán tử ngắn mạch như &&hoặc|| , thứ tự đánh giá của toán hạng thường không được chỉ định và bạn cũng không nên dựa vào nó.

Giáo viên cần ngừng giải thích quyền ưu tiên của nhà điều hành bằng cách sử dụng các cụm từ gây hiểu lầm như "điều này làm cho việc bổ sung xảy ra trước". Đưa ra một biểu thức x * y + z, lời giải thích phù hợp sẽ là "quyền ưu tiên của toán tử làm cho phép cộng xảy ra giữa x * yz, thay vì giữa yz", không đề cập đến bất kỳ "lệnh" nào.


6
Tôi ước các giáo viên của tôi đã thực hiện một số tách biệt giữa toán học cơ bản và cú pháp mà họ đã sử dụng để biểu diễn nó, giống như nếu chúng ta dành một ngày với các chữ số La Mã hoặc ký hiệu Ba Lan hoặc bất cứ điều gì và thấy rằng phép cộng đó có cùng thuộc tính. Chúng tôi đã học được sự kết hợp và tất cả những tài sản đó ở trường trung học, vì vậy có rất nhiều thời gian.
John P

1
Vui mừng bạn đã đề cập rằng quy tắc này không đúng với tất cả các ngôn ngữ. Ngoài ra, nếu một trong hai bên có tác dụng phụ khác, như ghi vào tệp hoặc đọc thời gian hiện tại, thì (ngay cả trong Java) không được xác định theo thứ tự xảy ra. Tuy nhiên, kết quả so sánh sẽ như thể nó được đánh giá từ trái sang phải (trong Java). Mặt khác: khá nhiều ngôn ngữ chỉ đơn giản là không cho phép trộn và so sánh theo cách này theo quy tắc cú pháp và vấn đề sẽ không phát sinh.
Abel

5
@ John: Nó trở nên tồi tệ hơn. 5 * 4 có nghĩa là 5 + 5 + 5 + 5 hay 4 + 4 + 4 + 4 + 4? Một số giáo viên nhấn mạnh rằng chỉ một trong những lựa chọn đó là đúng.
Brian

3
@Brian Nhưng ... nhưng ... nhân số thực là giao hoán!
Các cuộc đua nhẹ nhàng trong quỹ đạo

2
Trong thế giới suy nghĩ của tôi, một cặp dấu ngoặc đơn đại diện cho "là cần thiết cho". Tính toán ảa * (b + c), các dấu ngoặc đơn sẽ biểu thị rằng kết quả của phép cộng là cần thiết cho phép nhân. Bất kỳ tùy chọn toán tử ngầm nào cũng có thể được biểu thị bằng các phép liệt kê, ngoại trừ các quy tắc LHS-first hoặc RHS-first. (Điều đó có đúng không?) @Brian Trong toán học, có một vài trường hợp hiếm hoi có thể thay thế phép nhân bằng phép cộng lặp lại nhưng điều đó không phải lúc nào cũng đúng (bắt đầu bằng số phức nhưng không giới hạn). Vì vậy, các nhà giáo dục của bạn nên thực sự để mắt đến những gì họ đang nói với mọi người ....
syck 19/12/18

164

==là một toán tử đẳng thức nhị phân .

Toán hạng bên trái của toán tử nhị phân dường như được đánh giá đầy đủ trước khi bất kỳ phần nào của toán hạng bên phải được ước tính.

Đặc tả Java 11> Thứ tự đánh giá> Đánh giá thao tác tay trái trước


42
Từ ngữ "dường như" không có vẻ như họ chắc chắn, tbh.
Ông Lister

86
"Dường như" có nghĩa là thông số kỹ thuật không yêu cầu các thao tác thực sự được thực hiện theo thứ tự thời gian, nhưng nó yêu cầu bạn nhận được kết quả giống như bạn sẽ nhận được nếu chúng hoạt động.
Robyn

24
@MrLister "dường như" dường như là một lựa chọn từ kém về phía họ. Bằng cách "xuất hiện", họ có nghĩa là "biểu hiện như một hiện tượng cho nhà phát triển". "Có hiệu quả" có thể là một cụm từ tốt hơn.
Kelvin

18
trong cộng đồng C ++, điều này tương đương với quy tắc "như thể" ... toán hạng được yêu cầu phải hành xử "như thể" nó được thực hiện theo các quy tắc sau, ngay cả khi về mặt kỹ thuật thì không.
Michael Edenfield

2
@Kelvin Tôi đồng ý, tôi cũng đã chọn từ đó, thay vì "dường như".
MC Hoàng đế

149

Như LouisWasserman đã nói, biểu thức được đánh giá từ trái sang phải. Và java không quan tâm "đánh giá" thực sự làm gì, nó chỉ quan tâm đến việc tạo ra một giá trị (không biến động, cuối cùng) để làm việc với.

//the example values
x = 1;
y = 3;

Vì vậy, để tính toán đầu ra đầu tiên System.out.println(), sau đây được thực hiện:

x == (x = y)
1 == (x = y)
1 == (x = 3) //assign 3 to x, returns 3
1 == 3
false

và để tính toán thứ hai:

(x = y) == x
(x = 3) == x //assign 3 to x, returns 3
3 == x
3 == 3
true

Lưu ý rằng giá trị thứ hai sẽ luôn luôn đánh giá là đúng, bất kể giá trị ban đầu của xy, bởi vì bạn đang so sánh hiệu quả việc gán giá trị với biến được gán a = bbsẽ, được đánh giá theo thứ tự đó, luôn luôn giống nhau theo định nghĩa.


"Trái sang phải" cũng đúng trong toán học, nhân tiện, chỉ khi bạn đến dấu ngoặc đơn hoặc quyền ưu tiên, bạn lặp lại bên trong chúng và đánh giá mọi thứ từ trái sang phải trước khi đi xa hơn trên tầng chính. Nhưng toán học sẽ không bao giờ làm điều này; sự khác biệt chỉ quan trọng bởi vì đây không phải là một phương trình mà là một phép toán kết hợp, thực hiện cả một bài tập và một phương trình trong một swoop . Tôi sẽ không bao giờ làm điều này bởi vì khả năng đọc là kém, trừ khi tôi đang chơi golf mã hoặc đang tìm cách để tối ưu hóa hiệu suất, và sau đó, sẽ có ý kiến.
Harper - Phục hồi Monica

25

Tôi không chắc chắn nếu có một mục trong Đặc tả ngôn ngữ Java chỉ ra việc tải giá trị trước đó của một biến ...

Có. Lần tới khi bạn không rõ thông số kỹ thuật nói gì, vui lòng đọc thông số kỹ thuật và sau đó đặt câu hỏi nếu nó không rõ ràng.

... bên phải (x = y), theo thứ tự ngụ ý trong ngoặc, nên được tính toán trước.

Tuyên bố đó là sai. Dấu ngoặc đơn không ngụ ý một thứ tự đánh giá . Trong Java, thứ tự đánh giá được chuyển từ trái sang phải, bất kể dấu ngoặc đơn. Dấu ngoặc đơn xác định vị trí của ranh giới phụ, không phải thứ tự đánh giá.

Tại sao biểu thức thứ nhất đánh giá là sai, nhưng biểu thức thứ hai đánh giá là đúng?

Quy tắc cho ==toán tử là: đánh giá bên trái để tạo ra một giá trị, đánh giá bên phải để tạo ra một giá trị, so sánh các giá trị, so sánh là giá trị của biểu thức.

Nói cách khác, ý nghĩa của expr1 == expr2nó luôn giống như bạn đã viết temp1 = expr1; temp2 = expr2;và sau đó đánh giátemp1 == temp2 .

Quy tắc cho =toán tử có biến cục bộ ở phía bên trái là: đánh giá phía bên trái để tạo biến, đánh giá phía bên phải để tạo giá trị, thực hiện phép gán, kết quả là giá trị được gán.

Vì vậy, đặt nó cùng nhau:

x == (x = y)

Chúng tôi có một toán tử so sánh. Đánh giá bên trái để tạo ra một giá trị - chúng tôi nhận được giá trị hiện tại của x. Đánh giá bên phải: đó là một nhiệm vụ để chúng tôi đánh giá bên trái để tạo ra một biến - biến x- chúng tôi đánh giá bên phải - giá trị hiện tại của y- gán nó cho x, và kết quả là giá trị được gán. Sau đó chúng tôi so sánh giá trị ban đầu của xgiá trị được gán.

Bạn có thể làm (x = y) == xnhư một bài tập. Một lần nữa, hãy nhớ rằng, tất cả các quy tắc để đánh giá bên trái xảy ra trước tất cả các quy tắc đánh giá bên phải .

Tôi đã dự kiến ​​(x = y) sẽ được đánh giá trước, và sau đó nó sẽ so sánh x với chính nó (3) và trả về giá trị true.

Kỳ vọng của bạn dựa trên một tập hợp niềm tin không chính xác về các quy tắc của Java. Hy vọng rằng bây giờ bạn có niềm tin chính xác và sẽ trong tương lai mong đợi những điều thực sự.

Câu hỏi này khác với "thứ tự đánh giá các biểu hiện phụ trong biểu thức Java"

Tuyên bố này là sai. Câu hỏi đó hoàn toàn phù hợp.

x chắc chắn không phải là một 'subexpression' ở đây.

Tuyên bố này cũng sai. Đó là một biểu hiện phụ hai lần trong mỗi ví dụ.

Nó cần được tải để so sánh chứ không phải là 'đánh giá'.

Tôi không biết cái này nghĩa là gì.

Rõ ràng bạn vẫn còn nhiều niềm tin sai lầm. Lời khuyên của tôi là bạn đọc đặc tả cho đến khi niềm tin sai lầm của bạn được thay thế bằng niềm tin thực sự.

Câu hỏi là dành riêng cho Java và biểu thức x == (x = y), không giống như các cấu trúc không thực tế có tầm nhìn xa thường được tạo ra cho các câu hỏi phỏng vấn khó, đến từ một dự án thực tế.

Nguồn gốc của biểu thức không liên quan đến câu hỏi. Các quy tắc cho các biểu thức như vậy được mô tả rõ ràng trong đặc tả; đọc nó!

Nó được cho là một thay thế một dòng cho thành ngữ so sánh và thay thế

Vì sự thay thế một dòng đó gây ra sự nhầm lẫn lớn trong bạn, người đọc mã, tôi sẽ đề nghị rằng đó là một lựa chọn kém. Làm cho mã ngắn gọn hơn nhưng khó hiểu hơn không phải là một chiến thắng. Nó không có khả năng làm cho mã nhanh hơn.

Ngẫu nhiên, C # đã so sánh và thay thế như một phương thức thư viện, có thể được đưa vào một hướng dẫn máy. Tôi tin rằng Java không có một phương thức như vậy, vì nó không thể được biểu diễn trong hệ thống kiểu Java.


8
Nếu bất cứ ai cũng có thể đi qua toàn bộ JLS, thì sẽ không có lý do gì để xuất bản sách Java và ít nhất một nửa trang web này cũng sẽ vô dụng.
John McClane

8
@JohnMcClane: Tôi đảm bảo với bạn, không có bất kỳ khó khăn nào trong việc thực hiện toàn bộ thông số kỹ thuật, nhưng đồng thời, bạn không phải làm vậy. Đặc tả Java bắt đầu bằng một "mục lục" hữu ích, nó sẽ giúp bạn nhanh chóng đến các phần bạn quan tâm nhất. Nó cũng trực tuyến và có thể tìm kiếm từ khóa. Điều đó nói rằng, bạn đã đúng: có rất nhiều tài nguyên tốt sẽ giúp bạn tìm hiểu cách Java hoạt động; Lời khuyên của tôi cho bạn là bạn sử dụng chúng!
Eric Lippert

8
Câu trả lời này là không cần thiết và thô lỗ. Hãy nhớ rằng: hãy tử tế .
walen

7
@LuisG.: Không có ý định nhượng bộ hay ngụ ý; tất cả chúng ta đều ở đây để học hỏi lẫn nhau và tôi không đề xuất bất cứ điều gì tôi chưa từng làm khi tôi mới bắt đầu. Cũng không phải là thô lỗ. Rõ ràng và rõ ràng xác định niềm tin sai lầm của họ là một sự tử tế với poster ban đầu . Ẩn đằng sau "sự lịch sự" và cho phép mọi người tiếp tục có niềm tin sai lầm là không có ích , và củng cố những thói quen suy nghĩ xấu .
Eric Lippert

5
@LuisG.: Tôi đã từng viết một blog về thiết kế JavaScript và những bình luận hữu ích nhất tôi từng nhận được là từ Brendan chỉ ra rõ ràng và rõ ràng rằng tôi đã sai ở đâu. Điều đó thật tuyệt và tôi đánh giá cao anh ấy đã dành thời gian, bởi vì sau đó tôi đã sống 20 năm tiếp theo của cuộc đời tôi không lặp lại sai lầm đó trong công việc của mình, hoặc tệ hơn là dạy nó cho người khác. Nó cũng cho tôi cơ hội sửa chữa những niềm tin sai lầm tương tự ở người khác bằng cách sử dụng bản thân mình như một ví dụ về cách mọi người đến để tin vào những điều sai lầm.
Eric Lippert

16

Nó liên quan đến quyền ưu tiên của nhà điều hành và cách các nhà khai thác được đánh giá.

Dấu ngoặc đơn '()' có độ ưu tiên cao hơn và có tính kết hợp từ trái sang phải. Bình đẳng '==' đến tiếp theo trong câu hỏi này và có sự kết hợp từ trái sang phải. Bài tập '=' đến sau cùng và có tính kết hợp từ phải sang trái.

Hệ thống sử dụng ngăn xếp để đánh giá biểu thức. Biểu hiện được đánh giá từ trái sang phải.

Bây giờ đến câu hỏi ban đầu:

int x = 1;
int y = 3;
System.out.println(x == (x = y)); // false

Đầu tiên x (1) sẽ được đẩy lên stack. sau đó bên trong (x = y) sẽ được ước tính và đẩy lên ngăn xếp với giá trị x (3). Bây giờ x (1) sẽ được so sánh với x (3) nên kết quả là sai.

x = 1; // reset
System.out.println((x = y) == x); // true

Ở đây, (x = y) sẽ được ước tính, bây giờ giá trị x trở thành 3 và x (3) sẽ được đẩy lên ngăn xếp. Bây giờ x (3) với giá trị thay đổi sau khi đẳng thức sẽ được đẩy lên ngăn xếp. Bây giờ biểu thức sẽ được đánh giá và cả hai sẽ giống nhau vì vậy kết quả là đúng.


12

Nó không giống nhau. Phía bên trái sẽ luôn được đánh giá trước phía bên phải và dấu ngoặc không chỉ định thứ tự thực hiện, mà là một nhóm các lệnh.

Với:

      x == (x = y)

Về cơ bản, bạn đang làm giống như:

      x == y

x sẽ có giá trị của y sau khi so sánh.

Trong khi với:

      (x = y) == x

Về cơ bản, bạn đang làm giống như:

      x == x

Sau khi x lấy giá trị của y . Và nó sẽ luôn trở lại đúng sự thật .


9

Trong thử nghiệm đầu tiên, bạn đang kiểm tra 1 == 3.

Trong thử nghiệm thứ hai, kiểm tra của bạn không 3 == 3.

(x = y) gán giá trị và giá trị đó được kiểm tra. Trong ví dụ trước x = 1 trước thì x được gán 3. Liệu 1 == 3?

Trong phần sau, x được gán 3, và rõ ràng nó vẫn là 3. Liệu 3 == 3?


8

Xem xét điều này khác, có thể đơn giản hơn ví dụ:

int x = 1;
System.out.println(x == ++x); // false
x = 1; // reset
System.out.println(++x == x); // true

Ở đây, toán tử tăng ++xtrước phải được áp dụng trước khi so sánh được thực hiện - giống như (x = y)trong ví dụ của bạn phải được tính trước khi so sánh.

Tuy nhiên, đánh giá biểu thức vẫn xảy ra trái → sang → phải , do đó, so sánh đầu tiên thực sự là 1 == 2trong khi thứ hai là 2 == 2.
Điều tương tự xảy ra trong ví dụ của bạn.


8

Biểu thức được đánh giá từ trái sang phải. Trong trường hợp này:

int x = 1;
int y = 3;

x == (x = y)) // false
x ==    t

- left x = 1
- let t = (x = y) => x = 3
- x == (x = y)
  x == t
  1 == 3 //false

(x = y) == x); // true
   t    == x

- left (x = y) => x = 3
           t    =      3 
-  (x = y) == x
-     t    == x
-     3    == 3 //true

5

Về cơ bản câu lệnh đầu tiên x có giá trị 1 Vì vậy, Java so sánh 1 == với biến x mới không giống nhau

Trong phần thứ hai, bạn nói x = y có nghĩa là giá trị của x đã thay đổi và do đó khi bạn gọi lại, nó sẽ có cùng giá trị do đó tại sao nó đúng và x == x


4

== là toán tử đẳng thức so sánh và nó hoạt động từ trái sang phải.

x == (x = y);

ở đây giá trị được gán cũ của x được so sánh với giá trị gán mới của x, (1 == 3) // false

(x = y) == x;

Trong khi đó, ở đây giá trị gán mới của x được so sánh với giá trị giữ mới của x được gán cho nó ngay trước khi so sánh, (3 == 3) // true

Bây giờ hãy xem xét điều này

    System.out.println((8 + (5 * 6)) * 9);
    System.out.println(8 + (5 * 6) * 9);
    System.out.println((8 + 5) * 6 * 9);
    System.out.println((8 + (5) * 6) * 9);
    System.out.println(8 + 5 * 6 * 9);

Đầu ra:

342

278

702

342

278

Do đó, ngoặc đơn đóng vai trò chính trong các biểu thức số học không chỉ trong các biểu thức so sánh.


1
Kết luận là sai. Hành vi không khác nhau giữa các toán tử số học và so sánh. x + (x = y)(x = y) + xsẽ hiển thị hành vi tương tự như bản gốc với các toán tử so sánh.
JJJ

1
@JJJ Trong x + (x = y) và (x = y) + x không có so sánh liên quan, nó chỉ gán giá trị y cho x và thêm nó vào x.
Nisrin Dhoondia

1
... Vâng, đó là điểm. "Dấu ngoặc đóng vai trò chính của nó trong các biểu thức số học không chỉ trong biểu thức so sánh" là sai vì không có sự khác biệt giữa biểu thức số học và so sánh.
JJJ

2

Vấn đề ở đây là các toán tử arithmatic / toán tử quan hệ thứ tự ưu tiên ra khỏi hai toán tử =so với toán tử ==trội là ==(Toán tử quan hệ chiếm ưu thế) vì nó đi trước =các toán tử gán. Mặc dù được ưu tiên, thứ tự đánh giá là ưu tiên LTR (LEFT TO RIGHT) được đưa vào hình ảnh sau khi đánh giá thứ tự. Vì vậy, không phân biệt bất kỳ đánh giá ràng buộc nào là LTR.


1
Câu trả lời là sai. Ưu tiên toán tử không ảnh hưởng đến thứ tự đánh giá. Đọc một số câu trả lời được bình chọn hàng đầu để giải thích, đặc biệt là câu trả lời này .
JJJ

1
Đúng, đó thực sự là cách chúng ta được dạy ảo tưởng về những hạn chế về quyền ưu tiên đến tất cả những điều đó nhưng chỉ ra một cách chính xác nó không có tác động vì thứ tự đánh giá vẫn từ trái sang phải
Himanshu Ahuja

-1

Thật dễ dàng khi so sánh thứ hai ở bên trái là gán sau khi gán y cho x (bên trái), sau đó so sánh 3 == 3. Trong ví dụ đầu tiên, bạn đang so sánh x = 1 với gán mới x = 3. Có vẻ như luôn luôn có các câu lệnh đọc trạng thái hiện tại từ trái sang phải của x.


-2

Loại câu hỏi bạn đã hỏi là một câu hỏi rất hay nếu bạn muốn viết trình biên dịch Java hoặc các chương trình kiểm tra để xác minh rằng trình biên dịch Java đang hoạt động chính xác. Trong Java, hai biểu thức này phải tạo ra kết quả mà bạn đã thấy. Ví dụ, trong C ++, họ không phải - vì vậy nếu ai đó sử dụng lại các phần của trình biên dịch C ++ trong trình biên dịch Java của họ, về mặt lý thuyết bạn có thể thấy rằng trình biên dịch không hoạt động như bình thường.

Là một nhà phát triển phần mềm, viết mã dễ đọc, dễ hiểu và có thể bảo trì, cả hai phiên bản mã của bạn sẽ được coi là khủng khiếp. Để hiểu mã làm gì, người ta phải biết chính xác cách xác định ngôn ngữ Java. Một người viết cả mã Java và C ++ sẽ rùng mình khi nhìn vào mã. Nếu bạn phải hỏi tại sao một dòng mã duy nhất làm những gì nó làm, thì bạn nên tránh mã đó. (Tôi cho rằng và hy vọng rằng những người trả lời chính xác câu hỏi "tại sao" của bạn cũng sẽ tránh được mã đó).


"Để hiểu mã làm gì, người ta phải biết chính xác cách ngôn ngữ Java được định nghĩa." Nhưng điều gì sẽ xảy ra nếu mọi đồng nghiệp coi đó là lẽ thường?
BinaryTreeee
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.