Khó hiểu về cách hoạt động của hàm printf

Chào m.n, hôm nay rảnh nghịch thử hàm printf. Mình có chạy dòng code ntn.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
	int a=5;
	printf("%d %d", a++,a--);
	printf("\n\n%d", a);
}

output của n là:
4 5
5.
Ai giải thích cho mình đc k@@.

Có phải đối số trong hàm printf thực hiện từ phải qua trái k nhỉ?

Không có đâu :smiley: có khi từ trái qua.

Với lại ++a --a cùng một câu là tiêu rồi :smiley:

2 Likes

Tại vì mình nghĩ sau dấu phẩy đầu tiền thì a = 6, và trong dòng này n sẽ phải in ra là 5 6 chứ nhỉ @@.

Mình sửa hàm printf

printf("%d %d", a++,a=5);

output là : 5 6.@@

Giờ bạn đã thấy ra vấn đề chưa? :smiley:

Sự thật phũ phàng là ntn: Vừa đọc vừa ghi, hay ghi nhiều lần vào một biến giữa hai sequence point thì compiler thích cho bằng mấy cũng được, là một trong những undefined (không xác định) behavior.

3 Likes

bạn có thể hiểu như này:
message in ra sẽ là “[1] [2]” với [1], [2] là value tương ứng.
thứ tự các value trong print là a++, a–. chúng không được tính toán ngay màsẽ được lần lượt đưa vào queue và có thứ tự tương ứng. a++, a–. sau khi đưa hết các value vào queue thì sẽ lấy lần lượt các giá trị ra để tính toán theo thứ tự ngược lại : a–, a++.
đi theo từng bước ta có:

  1. a-- -> in ra giá trị của a(5) vào [2] trong message, sau đó a = 4,
  2. a++ -> in ra giá trị của a(4) vào [1] trong message, sau đó a = 5;
    => message đầu sẽ là: “4 5”,
    printf sau sẽ in ra giá trị của a là 5 thôi.

ps: nếu xuất hiện các value a, ++a, --a thì sẽ hơi khác một xíu.
VD:
int a = 5;
printf("%d %d %d %d %d", a++, ++a, a, a–, --a);

Theo luồng bên trên ta có message: “[1] [2] [3] [4] [5]”.
đi ngược lại thứ tự đưa vào của a++, ++a, a, a–, --a ta có:

  1. –a -> a = 4, chưa in ra giá trị của a vào ô số 5 ngay,
  2. a-- -> in giá trị của a vào ô số 4 (value = 4), sau đó a = 3.
  3. a -> chưa in ra giá trị của a vào ô số 3 ngay, tiếp tục tính toán.
  4. ++a -> a = 4, chưa in a vào ô số 2 ngay mà tiếp tục tính toán.
  5. a++ -> in ra a vào ô số 1 ( value = 4), sau đó a = 5;
  6. Tất cả những vị trí mà có a, ++a, --a và in ra giá trị cuối cùng của a ( value = 5) sau khi tính toán xong.
    Cuối cùng message thu được là: “4 5 5 4 5”.

Em giải thích hơi khó hiểu cũng như chém bừa, các bác nhẹ tay ném gạch ạ.

3 Likes

E nghĩ là đoạn code bên trên có xác định giá trị mà bác ơi.

1 Like

Mình nghĩ bạn rogp10 nói đúng r =)). Nãy search trên stackoverflow thấy họ cũng nói là undefined behavior.


Bạn thử vào đây đọc thử xem.
Dù sao cũng cảm ơn m.n

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?