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 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Thắc mắc về hoạt động của hàm x++,x--....

    em viết đoạn chương trình như sau:
    #include <stdio.h>
    #include <conio.h>

    main()
    {
    int x=10,y=11;
    int a=10,b=11;
    printf("x-- * ++y = %d
    x-- - --y = %d
    ",x-- * ++y,x-- - --y);
    printf("a-- * ++b = %d
    ",a-- * ++b);
    printf("a-- - --b = %d",a-- - --b);
    getch();
    }

    trong chương trình trên thì theo em nghĩ là hàm printf thứ nhất <=> với 2 hàm printf còn lại và chỉ khác là thay biến x thành a và y thành b (với x=a=10, y=b=11) nhưng sao lại cho ra các kết quả khác nhau ạ?

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dòng printf đầu là undefined behavior nhé [IMG]images/smilies/smile.png[/IMG]

    Có đến 2 vấn đề:
    - Không phải tham số đứng trước là tính trước
    - Thay đổi 1 biến 2 lần

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Dòng printf đầu là undefined behavior nhé [IMG]images/smilies/smile.png[/IMG]

    Có đến 2 vấn đề:
    - Không phải tham số đứng trước là tính trước
    - Thay đổi 1 biến 2 lần
    Có thể giải thích rõ hơn chút nữa ko ạ? em mới học nên ko hiểu lắm.
    vậy thì trong hàm printf đầu tiên thì nó sẽ chạy như thế nào? nó tính cái gì trước ạ?

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    function(a, b, c) thì thứ tự xét là a -> b -> c hay là c -> b -> a?

    ko quan trọng thứ tự, hay thứ tự ko xác định rõ ràng (undefined). Tùy mỗi trình dịch xử lý, có trình dịch đọc từ phải qua trái, có trình dịch đọc từ trái qua phải. Vì vậy mới gọi là undefined behavior.

    bài trên thì dòng printf đầu nó dịch từ phải qua trái, còn bạn thì ngỡ là nó dịch từ trái qua phải nên viết 2 dòng dưới theo thứ tự đó.


    khi truyền tham số vào hàm thì tham số thứ i ko nên làm ảnh hưởng tới giá trị / kết quả của tham số thứ j, mỗi tham số độc lập lẫn nhau... Ở đây tham số thứ 1 (x-- * ++y) làm ảnh hưởng tới giá trị của tham số thứ 2 (x-- - --y) nên ra kết quả ko xác định như trên.





    còn tại sao nó lại đọc từ phải qua trái mà ko phải từ trái sang phải thì các tham số khi truyền vào hàm được push lên stack rồi pop ra xét từ từ => tham số ở cuối sẽ được xét đầu tiên, tham số đầu tiên sẽ được xét cuối cùng. Đẩy lên queue thì sẽ ra thứ tự trái sang phải, nhưng queue chậm/viết phức tạp hơn stack nhiều.

 

 

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
  •