Trang 6 / 6 FirstFirst ... 3456
Hiển thị kết quả từ 51 đến 53 / 53

Chủ đề: i++ và ++i

  1. #51
    Tham gia
    15-03-2010
    Bài viết
    1,118
    Like
    21
    Thanked 876 Times in 490 Posts
    Quote Được gửi bởi ueih View Post
    1) trước tiên phải hiểu a++ khác ++a chổ nào
    2) thứ 2 phải hiểu nguyên tắc một function đẩy các biến (push) lên bộ nhớ thế nào
    vậy a++ có nghĩa là mang giá trị a vào một function hay cái gì đó trước khi tăng a
    ++a nghĩa là tăng giá trị a trước rồi với mang giá trị a được tăng vào một function hay cái gì đó
    (hai đều trên có lẻ nhiều bạn biết rồi)
    cái quan trong là đều thứ 2, C++ ngược với Visual basic. Trong function C++ đảy các giá trị từ phải qua trái và viúal baic tì ngược lại (muốn hiểu function, sub, hay procedure gì cũng được).
    vậy hay phân tích bài toán

    1) int a = 10,b;
    2) b = a++ + ++a;
    3) printf("%d %d %d %d",b,a++,a,++a);

    1) a= 10 và b chưa được gán
    2) b = 11 + 11 = 22 và a = 12 (a++ hay ++a chỉ là đánh lừa cảm giác bạn thôi,
    có thể viết (++a) + (++a) hay (a++) + (a++) cũng là tăng a 2 lần thành 12
    3) cái 3 này với phức tạp, coi chừng cũng bài toán này mà viết băng visual basic và C++ chất chắn sẻ có kết qủa khác nhau (riêng C# mình không nghiên cứu, nếu C# push theo visual báic thì là thảm họa), với C++ lệnh printf("%d %d %d %d",b,a++,a,++a); sẻ đi lần lượt từ phải qua trái
    ++a (a = 13)
    a (cũng bằng 13)
    a++ (kết quả in ra là 13 nhưng a đã là 14)
    b (dĩ nhiên vẩn là 22)
    vậy kết quả cuối cùng là 22, 13, 13, 13 nhưng chú ý nếu sau đó bạn printf("%d ,a); thì a sẻ là 14
    vậy theo cách đó mà bằng visual báic thì s3 là 22, 12, 13, 14 và a là 14 cuối cùng (vì visual basic đảy theo chiều ngược lại
    chúc bạn thành công
    Kinh rợn thật, đã là trường hợp tiêu chuẩn từ chối không xác định mà cứ ít bữa lại có một tay bới lên cố gắng giải thích.

    Trình dịch có bổn phận phải tuân thủ theo tiêu chuẩn. Một khi tiêu chuẩn đã nói là không xác định thì trình dịch có quyền dịch theo lô gic của mình. Kết quả sẽ ra khác nhau tuỳ theo cách làm việc của trình dịch.

    Người nào tính ra kết quả số này số nọ chỉ là tự dùng lô gic lý luận của mình mà không cần để ý đến việc mỗi ngôn ngữ có tiêu chuẩn riêng của nó.

    @ueih: lý luận của bạn có thể đúng với Visual C++. Nhưng Visual C++ là ngôn ngữ đưoc thêm mắm dặm muối Microsoft và không có một thời điểm nào Microsoft tuyên bố rằng ngôn ngữ của họ tuân thủ theo tiêu chuẩn Ansi C hay C++ cả.

  2. #52
    Tham gia
    02-08-2009
    Bài viết
    50
    Like
    0
    Thanked 3 Times in 3 Posts
    bài này mình hình như đã trả lời rồi
    b = a++ + ++a; tức b=21 và a = 12
    printf("%d %d %d %d",b,a++,a,++a);
    ở đây nếu là c++ thì hàm printf sẻ đi từ phải sang trái tứ ++a --> a --> a++ cuối cùng là b
    vậy kết quả sẻ là 21, 13, 13, 13 và giá trị a sẻ là 14 vì a++ có nghĩa là mang giá trị của a vào hàm printf sau đó mới tăng a = 14
    Nếu là visual basic "có hàm printf" thì sẻ đi ngược từ trái sang phải: b --> a++ --> a cuối cùng là a++
    vậy kết quả sẻ là 21, 12, 13, 14
    Ở bài này tác giã muốn người học phải hiểu một hàm giống nhau với ngôn ngữ này hay ngôn ngữ khác sẻ ra kết quả khác nhau nếu không nắm được từ trái qua hay từ phải qua

  3. #53
    Tham gia
    02-08-2009
    Bài viết
    50
    Like
    0
    Thanked 3 Times in 3 Posts
    Hi ban megaownge và Zodiac123
    Thanks cho ý kiến của bạn, khi mình trả lời mình chưa đọc bài viết của bạn (bởi khi mở lên phần đầu không có ý kiến bạn nên mình dọc sót sau đó mới thay có tới 50 ý kiến trong câu hỏi này nên mình xem lại)
    Vấn đề là trả lời kết quả câu hỏi b = a++ + ++a chứ không tranh cải chuẩn C hay Ansi C hay C++ và chuẩn riêng của Microsoft. Ở đây tác giã đưa bài có lẻ cũng rất am hiểu sự khác biệt của các chuẩn này nên đưa ra bài toán thách đố chơi (chính mình cũng thấy sai lầm khi đọc bài của bạn zodiac123 ở asembly code). Và có lẻ chính tác giả cũng khuyên người viết C "nói chung" nên viết tường minh là b = (a++) + (++a) thì sẻ kết quả giống nhau dù là borland C hay Microsoft C hay visual studio 2005 hay 2008 cũng vậy.
    Mình không dám kết luận nhưng "có vẻ" chuẩn C "nói chung" không quy định cộng a++ hay ++a trước (mã Asembly của bạn zodiac123 cho thấy visual studio 2005 đã cộng ++a trước rồi a++ sau)
    Dù sau thì bài này cũng rất hay vì chính mình cũng bị mắt lừa kết quả của b = a++ + ++a
    Thanks 2 bạn, mình thích giao tiếp với người có trình độ khá để học hỏi thêm

Trang 6 / 6 FirstFirst ... 3456

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • 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
  •