2015-09-17 19 views
5

này xảy ra trong khi tôi đang giải quyết một 'Cracking cuộc phỏng vấn Mã hóa' câu hỏi:Java hành vi tử gán vs C++

Viết một hàm để trao đổi một số tại chỗ (có nghĩa là, không biến tạm thời)

tôi quyết định viết lên giải pháp của tôi trong Java (vì tôi có kế hoạch về việc sử dụng Java trong các cuộc phỏng vấn thực tập của tôi.)

tôi đã đưa ra một giải pháp mà tôi đã gần như tự tin là câu trả lời đúng (vì tôi đã làm nó trong một dòng):

public static void main(String args[]) { 
     int a = 5; 
     int b = 7; 
     a = b - a + (b = a); 
     System.out.println("a: " + a + " b: " + b); 
    } 

Chắc chắn đủ, mã này thực thi kết quả mong muốn. a == 7b == 5.

Bây giờ, đây là phần thú vị.

Mã này sẽ không chạy trong C++ cũng không phải là giải pháp này ở mặt sau của cuốn sách.

Vì vậy, câu hỏi của tôi là: Tại sao giải pháp của tôi hoạt động chính xác? Tôi giả sử Java làm những việc khác với các ngôn ngữ khác?

+0

Gợi ý: xor ........... –

+1

Tôi nghĩ rằng (b = a) không trả lại bất kỳ điều gì trong C++. Hoặc có lẽ tôi sai, tôi không biết C++. – Sweeper

+1

Đối với java: http://stackoverflow.com/questions/12850676/return-value-of-assignment-operator –

Trả lời

5

sẽ tìm những Java Language Specification, section 15.7 (Evaluation Order):

Các bảo đảm ngôn ngữ lập trình Java mà các toán hạng của nhà khai thác có vẻ như được đánh giá theo một thứ tự đánh giá cụ thể, cụ thể là, từ trái sang phải.

Vì vậy, trong Java, thứ tự đánh giá được xác định rõ và làm những gì bạn mong đợi.

Đặc tả C++ không cung cấp đảm bảo như vậy; trong thực tế, đó là hành vi không xác định để chương trình có thể làm bất cứ điều gì theo nghĩa đen.

Trích dẫn từ cppreference, lưu ý rằng không có quy tắc trình tự tồn tại cho chuỗi toán hạng số học khai thác:

Nếu một tác dụng phụ trên một đối tượng vô hướng là unsequenced liên quan đến một tính toán giá trị sử dụng giá trị của cùng một đối tượng vô hướng, hành vi là không xác định.

+2

Ngược lại, "Nếu một tác dụng phụ trên đối tượng vô hướng không được kết quả liên quan đến tính toán giá trị bằng cách sử dụng giá trị của cùng một đối tượng vô hướng, hành vi không xác định." ([cppreference] (http://en.cppreference.com/w/cpp/language/eval_order)), lưu ý rằng không có quy tắc trình tự tồn tại để giải trình tự toán hạng cho toán tử số học. – Amadan

+0

@Amadan cảm ơn, tôi đã kết hợp điều đó –

Các vấn đề liên quan