Bài số 19 C++ cơ bản của a Đạt chạy trên Clion
Sao e nhập như thế mà số nguyên là số thực nó ko đổi vậy a?
Nhập ban đầu so_nguyen=101, so_thuc=45,7
[code]#include
#include
#include
using namespace std;
int main(){
int so_nguyen;
double so_thuc;
cout<<“Nhap vao mot so nguyen va mot so thuc
”;
cin>>so_nguyen>>so_thuc;
cout<<“so_nguyen == “<<so_nguyen <<”
songuyen + 1 == “<<so_nguyen+1
<<”
so_thuc x 3 == “<<so_thuc3
<<"
so_nguyen^2 == "<<so_nguyenso_nguyen
<<”
so_nguyen %2 == “<<so_nguyen%2
<<”
so_nguyen == “<< so_nguyen << “
”
<<”
so_thuc == “<< so_thuc << “
”;
cout << “
Cac phep tang giam truc tiep”
<<”
so_nguyen+1==”<<++so_nguyen
<<"
so_thuc -=3 =="<<(so_thuc -=3)
<<"
so_nguyen*=2 ==" <<(so_nguyen*=2)
<<"
can bac 2 so_thuc ==" << sqrt(so_thuc)
<<"
songuyen == “<<so_nguyen
<<”
sothuc =="<<so_thuc;
return 0;
}[/code]
Em vừa thử với codeblocks kết quả vẫn vậy ?? @ltd
<img src="https://daynhauhoc.com//daynhauhoc.s3-ap-southeast-1.amazonaws.com/original/2X/8/8ce1fc99b6c4c37543bcf2b8ae6a591386cb4aee.png" width=“690” height=“388” /img>
Bạn debug để xem tuần tự lệnh mà máy chạy có giống bạn hình dung không nhé, có vài điều khá thú vị ở đây
cái kiểu viết này cũng là undefined behavior đó bạn
cout << a << a++ << ++a;
vì trong C++ << cũng chỉ là 1 toán tử như + - * /, mà viết ++a + a++ thì là undefined behavior, mỗi compiler dịch ra code khác nhau…
cách sửa là viết tuần tự
cout << a;
cout << a++;
cout << ++a;
@ltd vào sửa bài tập nè
Sau khi sửa lại code thì nó ra đúng kết quả rồi, mà e vẫn ko hiểu vì sao .
do trình dịch nó dịch theo thứ tự sao cho dịch nhanh đó
do
(so_nguyen*=2)
có dấu()
nên nó ưu tiên thực hiện trước, nênso_nguyen = so_nguyen*2
trước khi tất cả operator<< được thực hiện, tương tự ++ cũng được ưu tiên trước <<, nhưng do ko có()
nênso_nguyen = so_nguyen + 1
được thực hiện sau. Đáng lẽ operator*= của int phải trả về int&, nhưng có lẽ trình dịch này nó trả về int chứ ko phải trả về reference (tối ưu hóa, với các kiểu nguyên thủy thì trả về bản copy lẹ hơn là trả về reference), nên mới ra 202 thay vì 203 như ++so_thuc trả về int&.nói chung đây là 1 cách giải thích nhưng chả có nghĩa lý gì. Vì compiler nó phải dịch sao cho các tham số ko phụ thuộc vào nhau như viết ghép ++a + a++, nó thích chuyển sao cũng được, nên mới gọi là undefined behavior - cách xử lý ko xác định, xác định ở đây là chỉ có 1 kết quả duy nhất.