30/09/2018, 16:06

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

viết 18:13 ngày 30/09/2018

#include<iostream>
int main(){
int i, j;
i = 1; j = 2;
std::cout << (i=j)++ << std::endl; //đúng
std::cout << i+j++ << std::endl; //đúng
std::cout << ++(i + j) << std::endl; //sai
std::cout << ++i++ + j << std::endl; //sai
return 0;
}
Biểu thức nào đúng ? Giải thích ?
Ai giúp mình với

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.

Bùi Thanh Tùng viết 18:13 ngày 30/09/2018

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

AnNdth viết 18:14 ngày 30/09/2018

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???

Bùi Thanh Tùng viết 18:10 ngày 30/09/2018

Ai Giải thích đi ạ.

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???

#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;
}
viết 18:08 ngày 30/09/2018

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

#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

buithaiminh viết 18:15 ngày 30/09/2018

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; //  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;
}
Bùi Thanh Tùng viết 18:19 ngày 30/09/2018

cout << ++i++;

cout << ++(i++);

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ố ++ ư?

AnNdth viết 18:14 ngày 30/09/2018

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à???

Bài liên quan
0