Chủ đề: Toán tử tăng giảm phức tạp?
-
08-08-2015, 05:51 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Toán tử tăng giảm phức tạp?
Mình có 3 câu hỏi tính toán sau
1. a = (a = 8, ++a + a++)
Theo mình nghĩ a = 19, nhưng chạy chương trình thì ra a = 18
2. a = (a = 8, --a - a--)
Tương tự như trên, mình nghĩ a = -1, nhưng lại ra a = 0
3. y = 2
x = y++ + ++y * (3 - --y)
Kết quả ra x = 2, mình chạy tay vẫn ko thể nào ra đc kết quả này.
Mong các bạn giúp đỡ giảng giúp mình.
Xin chân thành cảm ơn!View more random threads:
- chạy ứng dụng Java đơn giản CPU: 80%
- Làm thế nào để có thể vẽ được cây sơ đồ như hình?
- Cách nào debug một chương trình J2ME đã built thành file jar?
- Công dụng của hàm class.newInstance() trong Java như thế nào?
- Cách nào để Xây dựng constructor chứa thuộc tính là đối tượng của một lớp khác???
- [JavaCV] Sử dụng thư viện JavaCV trong lập trình Android
- multithread với 3 thread trở lên
- Truyền file bằng giao thức TCP và UDP
- Làm phần mềm xem ảnh trong Java Swing?
- Vấn đề login với sự kết hợp struts2 spring và hibernate
-
11-08-2015, 12:24 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Câu 1.
int a = 8;
x = ++a(thực hiện phép tăng giá trị của a trước => a =9) + a++ (thực hiện phép + rồi mới tăng giá trị của a, nghĩa là trong phép + a vẫn bằng 9, tính x xong thì a mới bằng 10)
nên kết quả cuối cùng là x=18, a=10
Câu 2. tương tự
Câu 3. chưa nghĩ ra
-
11-08-2015, 01:42 PM #3Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hình như các bài toán dạng này đã được nhắc tới rất nhiều và có nhiều bạn cho rằng kết quả là mập mờ tùy theo Compiler nên khó có ý kiến.
Còn bạn yuna_yukita đã làm theo hướng đó thì cứ tiếp tục như thế thôi :
y = 2
x = y++ + ++y * (3 - --y)
" x = y++ " : x = 2; y=3
"++y" : Đoạn này có giá trị k1 = 4 và lúc này y = 4
"--y" : Đoạn này có giá trị k2 = 3 và lúc này y = 3
" ++y * (3 - --y) " : Bây giờ trở thành k1 * ( 3 - k2 ) = 4 * ( 3 - 3) = 0 nên x vẫn giữ nguyên giá trị
Mập mờ là ở chỗ như người giải số đề vậy, số ra rồi thì ta mới bắt đầu đoán cách thức Compiler thực hiện.
-
12-08-2015, 04:54 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Bài tập thì làm. Nhưng thực tiễn thì đừng bao giờ thay đổi giá trị của một biến quá 1 lần trong một biểu thức. Ví dụ viết đơn giản thế này cũng không nên:
a = a++;
-
12-08-2015, 05:27 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Java thì mấy biểu thức này không là vấn đề. (từ trái sang phải)
15.7.1 và 15.7.2: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7.1
Nhưng C/C++ thì 3 biểu thức đều là undefined hết.
- Bài 1 có thể ra 19 hoặc 20 (đó là khi compiler ko chơi xấu, vì compiler đc quyền làm vậy)
- Bài 2 có thể ra -2 hoặc 0.
- Bài 3 còn phức tạp hơn.
Thường thì xét 1 biểu thức như ++i + i++ thì sẽ có vấn đề là khi cho ra 1 kq thì biểu thức sinh ra nó là (x0+1) + (x0+1)? Hay x0 + (x0+2)?
* Undefined: compiler muốn làm gì cũng được (chơi xấu cũng được). Dành cho những cách sử dụng "hết sức bậy bạ".
* Implementation-defined: thường là các thông số cần thiết: sizeof() v.v... Có thể nói là nhất quán với mỗi version, nhưng nếu dựa vào nó code sẽ ko portable
* Unspecified: Hoặc A, hoặc B, (C, D, ...). Cũng tùy lúc, khác với undefined ở chỗ là compiler bị giới hạn giữa các lựa chọn A, B, C...; nói theo một cách nào đó thì vẫn là defined. Nếu dựa vào unspecified là tiêu.
p/s: đây là box Java cơ mà.
-
12-08-2015, 05:53 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
-
12-08-2015, 07:19 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
ko đọc kĩ là java, tự xóa
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...