Hỏi về phép ++i và i++

Chào mọi người, mình thấy trên mạng có bài test này, mình không nắm rõ được trình tự nó thực hiện ra sao, mọi người có thể giải thích giúp được không?
Ques 10 : what is the output of following program?

void main(){
	int a=1;
	void xyz(int , int);
	xyz(++a,a++);
	xyz(a++,++a);
	printf("%d",a);
	}
   void xyz(int x, inty){
    printf("%d%d",x,y);
   }

Đáp án là 3 1 4 4 5

1 Like

i++ ++i về cơ bản sau 2 lệnh này giá trị i nó như nhau.
Giá trị cuối cùng giống nhau, khác nhau duy nhất là ++i thì tăng trước rồi muốn làm gì thì làm. Còn i++ thì làm cái gì cứ làm đi rồi tăng i sau.
i++ là cưới đi rồi chén, ++i là chén đi rồi cưới.,
kết quả vẫn là cưới.

1 Like

Sao code của bạn mình lại ra 31455 nhỉ?

int i = 0;
printf("%d ", i++); /* in giá trị i, rồi tăng i lên 1 */
printf("%d", ++i); /* tăng i lên 1 rồi mới in giá trị i */

Output: 0 2

Theo mình trường hợp này là thuộc dạng “undefined behavior” - không xác định được cách hoạt động vì ngôn ngữ không quy định thứ tự truyền tham số vào hàm nên kết quả ra tùy thuộc vào compiler. Đây là kết quả test sử dụng các compiler khác nhau:

  • Dùng gcc: 31455
  • Dùng clang: 22355
1 Like

Do đó những cấu trúc lệnh không xác định rõ ràng và không giống nhau ở mỗi Compiler thì tốt nhất là không dùng.
Và trong thực tế rất hiếm thấy dùng ++i.

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