Trang 2 / 6 FirstFirst 12345 ... LastLast
Hiển thị kết quả từ 11 đến 20 / 53

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

  1. #11
    Tham gia
    15-10-2007
    Bài viết
    1,720
    Like
    27
    Thanked 135 Times in 89 Posts
    Quote Được gửi bởi zodiac123 View Post
    void main()
    {
    int a = 10, b;
    b = a++ + ++a;

    a = a + 1;
    printf("%d %d %d %d", b, a, a, a);
    a = a + 1;

    } ?
    in ra rồi cộng thêm nữa làm gì vô ích?

  2. #12
    Tham gia
    26-02-2011
    Bài viết
    4
    Like
    0
    Thanked 0 Times in 0 Posts
    cac a lam giup e di (

  3. #13
    Tham gia
    07-10-2009
    Bài viết
    33
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi maicon View Post
    in ra rồi cộng thêm nữa làm gì vô ích?
    Bởi vì tính từ sau lệnh "b = a++ + ++a" đến cuối chuơng trình thì a nó increment thêm 2 lần nữa đó bạn

    Vấn đề ở đây là lệnh "printf("%d %d %d %d",b,a++,a,++a);" thì lúc nào a tăng lên, và lúc nào thì xuất ra stdout.

  4. #14
    Tham gia
    06-06-2006
    Location
    HCM
    Bài viết
    2,241
    Like
    131
    Thanked 64 Times in 47 Posts
    phép toán ++, -- là cái hay của c++ nhưng mình nghĩ có lẽ trên thực tế, trên dự án lớn thì hạn chế xài và hạn chế xài những cái mà người ta hay đưa ra để chứng minh c++ "tài năng" hơn các ngôn ngữ khác.

    đây có lẽ là 1 ví dụ tuyệt vời nhất để chứng minh điều này.

  5. #15
    Tham gia
    15-10-2007
    Bài viết
    1,720
    Like
    27
    Thanked 135 Times in 89 Posts
    Quote Được gửi bởi zodiac123 View Post
    Bởi vì tính từ sau lệnh "b = a++ + ++a" đến cuối chuơng trình thì a nó increment thêm 2 lần nữa đó bạn
    Kết quả ở đây là kết quả in ra chứ ko quan tâm đến kết quả cuối chương trình là gì.

  6. #16
    Tham gia
    26-06-2010
    Bài viết
    16
    Like
    2
    Thanked 0 Times in 0 Posts
    --Kết quả chính xác là : 22 13 13 13
    --Vì trước lệnh "printf("%d %d %d %d",b,a++,a,++a);" giá trị của a = 12, b= 22 (cái này không ai bàn cãi gì đúng không). Mấu chốt thứ 1 của vấn đề là: print(a++) <=> print(a) sau đó a mới tăng lên 1 đơn vị, còn print(++a) thì a tăng lên 1 rồi mới in ra màn hình. Thứ 2 là trong lệnh "printf("%d %d %d %d",b,a++,a,++a);" trật tự thực hiện sẽ là ++a, a, a++, b sau khi có được kết quả thì sẽ được in theo chiều ngược lại (nói đúng hơn là hệ thống sẽ xử dụng stack (FILO) trong trường hợp này).
    Cụ thể trong trường hợp này các bạn hình dung ta có stack như sau:

    -----------------------------------------------------
    |print(++a)=13|print(a)=13|print(a++)=13|print(b)= 22 ->
    -----------------------------------------------------
    --Cuối cùng thì chương trình sẽ lần lượt in ra theo chiều mũi tên và được kết quả là 22 13 13 13
    --Nếu các bạn thay "b" = "a" trong lệnh printf trên thì kết quả sẽ là:
    14 13 13 13
    --Đôi dòng chia sẻ, nếu có gì sai mong nhận được sự góp ý chân thành từ mọi người.

  7. #17
    Tham gia
    16-02-2011
    Bài viết
    8
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi kingnand View Post
    --Kết quả chính xác là : 22 13 13 13
    --Vì trước lệnh "printf("%d %d %d %d",b,a++,a,++a);" giá trị của a = 12, b= 22 (cái này không ai bàn cãi gì đúng không). Mấu chốt thứ 1 của vấn đề là: print(a++) <=> print(a) sau đó a mới tăng lên 1 đơn vị, còn print(++a) thì a tăng lên 1 rồi mới in ra màn hình. Thứ 2 là trong lệnh "printf("%d %d %d %d",b,a++,a,++a);" trật tự thực hiện sẽ là ++a, a, a++, b sau khi có được kết quả thì sẽ được in theo chiều ngược lại (nói đúng hơn là hệ thống sẽ xử dụng stack (FILO) trong trường hợp này).
    Cụ thể trong trường hợp này các bạn hình dung ta có stack như sau:

    -----------------------------------------------------
    |print(++a)=13|print(a)=13|print(a++)=13|print(b)= 22 ->
    -----------------------------------------------------
    --Cuối cùng thì chương trình sẽ lần lượt in ra theo chiều mũi tên và được kết quả là 22 13 13 13
    --Nếu các bạn thay "b" = "a" trong lệnh printf trên thì kết quả sẽ là:
    14 13 13 13
    --Đôi dòng chia sẻ, nếu có gì sai mong nhận được sự góp ý chân thành từ mọi người.
    bạn chạy = công cụ gì vậy ! Mình chạy trên viúal 2010 thì là: 22 13 14 14. Mình đang không hiểu tại sao nó lại ra như vậy đây !

  8. #18
    Tham gia
    26-06-2010
    Bài viết
    16
    Like
    2
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi vdanh20888 View Post
    bạn chạy = công cụ gì vậy ! Mình chạy trên viúal 2010 thì là: 22 13 14 14. Mình đang không hiểu tại sao nó lại ra như vậy đây !
    mình chạy bằng C-Free

  9. #19
    Tham gia
    01-01-2008
    Location
    Thiên đường hạnh phúc
    Bài viết
    820
    Like
    9
    Thanked 123 Times in 64 Posts
    Quote Được gửi bởi vdanh20888 View Post
    bạn chạy = công cụ gì vậy ! Mình chạy trên viúal 2010 thì là: 22 13 14 14. Mình đang không hiểu tại sao nó lại ra như vậy đây !
    Bạn nhìn bài do mình post đấy. Chạy bằng Turbo C++
    Mình nghĩ cái nì do biên dịch thôi. Mình thử code bằng C# 2010
    PHP Code:
                int a 10b;
                
    a++ + ++a;
                
    Console.WriteLine("{0}-{1}-{2}-{3}",b,a++,a,++a); 
    Thì có kết quả: 22 12 13 14. Nghĩ cũng hãi thật
    Nhưng mình vẫn nghĩ kết quả: 22 13 13 13 là hợp lý.

    Vấn đề này rất quan trọng nếu ai muốn có chứng chỉ Java, PHP,...

  10. #20
    Tham gia
    05-03-2010
    Bài viết
    129
    Like
    2
    Thanked 16 Times in 16 Posts
    Chào cả nhà,mình thấy topic sôi nổi vì 1 vấn đề nho nhỏ mà không hề nhỏ,mình cũng mạo muội góp vui có gì ko phải thì cả nhà lượng thứ!

    Chúng ta nhắc lại 1 số khái niệm Base trước trong C Standard nhá:
    i++ : Sử dụng giá trị của i trước rồi +1.
    ++i : Sử dụng giá trị i+1 luôn.

    OK tiếp theo là phân tích từng đoạn code nhé:
    các giá trị ban đầu chúng ta có là a=10,b.
    b=a++ + ++a Ở đoạn này giá trị của a++=10 đọc xong a++ rồi thì giá trị được +1 tức là 11,tiếp theo là ++a=12 vì a đã được cập nhật lại là 11 và tăng thêm 1=12 ----> b=10+12.

    printf("%d %d %d %d",b,a++,a,++a) Trong câu lệnh này thì b=22 ko nói rồi.Nối tiếp dòng lệnh trên thì a++=12 vì sử dụng giá trị trước khi +1,sau khi dùng giá trị rồi thì ngay lập tức a được +1=13.Cuối cùng là ++a được sử dụng giá trị a+1 luôn tức là 14.

    Phù...Sau 1 hồi Debug bằng tay,sử dụng ngôn ngữ Việt để biên dịch thì mình cho ra kết quả là b=22 a++=12 a=13 ++a=14 //Không dựa trên IDE nào cả chỉ dùng các chuẩn của C Standard để Debug thôi ---> Java cho kết quả đúng.Các bạn đối chiếu xem sao nhé! Nếu bạn nào cho ra kết quả khác thì các bạn phải chứng minh bằng C Standard để mọi người cùng tham khảo.Mình xin hết.

Trang 2 / 6 FirstFirst 12345 ... LastLast

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
  •