Biểu thức đúng trong C++

#include<iostream>
int main()
{
    int i, j;
    i = 1;
    j = 2;
    std::cout << (i=j)++ << std::endl;
    std::cout << i+j++ << std::endl;
    std::cout << ++(i + j) << std::endl;
    std::cout << ++i++ + j << std::endl;
    return 0;
}

Biểu thức nào đúng ? Giải thích ?
Ai giúp mình với :smiley:

1 Like

2 biểu thức sau sai vì khi xét độ ưu tiên toán tử, toán tử ++ tiền tố sẽ thực hiện trước, và cái mà tiền tố ++ tác động đến phải là 1 toán hạng, chứ không phải 1 biểu thức (nghĩa là nó phải tác động lên giá trị, đã được tính toán trước rồi). Như vậy thì 2 biểu thức trên đúng, vì hậu tố ++ sẽ thực hiện sau khi biểu thức trong ngoặc (i=j) hoặc i+j được tính toán xong, khi đó nó trở thành giá trị, và toán tử hậu tố ++ có thể tác động lên.

2 Likes

biểu thức thứ 3 như vậy thì mình hiểu rồi. Đang ngẫm lại cái biểu thức thứ 4 kìa :smiley:

Có thể giải thích cho mình cách nó thực hiện biểu thức thứ 1 k? Tại sao ra bằng 2 vậy???

1 Like

Ai Giải thích đi ạ.

#include <iostream>
int main(){
	int i, j;
	i = 1; j = 2;
	
	std::cout << (i = j) << std::endl; // Gán giá trị của j cho i. Và i = 2
	std::cout << i++ << std::endl; //  Tại sao vẫn = 2 nhỉ?
	std::cout << i << std::endl; // Tại sao lại = 3?
	
	return 0;
}
#include <iostream>
using namespace std;

int main() {
	
	int i = 1;
	
	cout << ++i++;
	cout << ++(i++);
	return 0;
}

Bạn chạy thử cái này, nó sẽ báo 2 lỗi giống nhau. Mình post lỗi đó ra luôn:

prog.cpp: In function ‘int main()’:
prog.cpp:8:13: error: lvalue required as increment operand
  cout << ++i++;

prog.cpp: In function ‘int main()’:
prog.cpp:8:16: error: lvalue required as increment operand
  cout << ++(i++);

Vậy theo mình nghĩ compiler nó coi i++ là 1 biểu thức. Nên trường hợp thứ 2 trên là sai.
Còn trường hợp 1 thì mình cũng hiểu hơi hoang mang :smiley:

1 Like
#include <iostream>

int main(){
   int i, j;
   i = 1; j = 2;

   std::cout << (i = j) << std::endl; // Gán giá trị của j cho i. Và i = 2
   std::cout << i++ << std::endl; //  Truy vấn giá trị của i trước khi tăng i 1 đơn vị, lúc này là 2
   std::cout << i << std::endl; // Truy vấn giá trị của i, lúc này là 3 vì đã thực hiện i++ ở trên
   return 0;
}
1 Like

vậy là Compiler coi 2 biểu thức trên là giống nhau? Tại sao nhỉ ? Nó ưu tiên tính hậu tố ++ trước rồi mới tính đến tiền tố ++ ư?

Cho mình hỏi vì sao lúc này nó in ra i=2 chứ không phải i = 3??? Vì mình đọc trong sách thấy phần ưu tiên toán tử << thấp hơn ++ mà???

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