Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    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!

  2. #2
    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

  3. #3
    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.

  4. #4
    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++;

  5. #5
    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à.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    p/s: đây là box Java cơ mà.
    Oh men... giờ mới để ý thấy :v

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ko đọc kĩ là java, tự xóa

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •