01/10/2018, 15:40

Cout có tự động xác định kiểu dữ liệu không?

Mình có 1 đoạn code nhỏ:

int main()
{
    long long n;
    cin>>n;
    cout<<n*(n-1)*(n-2)/6;
}

Nếu mình đổi n thành int n thì mình nhận giá trị rác khi nhập vào 1 số lớn (như 2000). Cho mình hỏi như vậy cout sẽ cho kết quả dựa theo biến?

HK boy viết 17:45 ngày 01/10/2018

Trả lời câu hỏi của title: Không.

Code của bạn lỗi không phải do cout, mà là do bạn đặt kiểu dữ liệu sai.

Kết quả của phép tính phụ thuộc vào kiểu của các biến tham gia.

Nếu bạn đặt n là int, thì phép tính n*(n-1)*(n-2) của bạn sẽ nhân các số kiểu int với nhau và cho ra kết quả kiểu int.

n = 2000 (int) -> phép tính = 2000 * 1999 * 1998 > 2^31-1 => kết quả sẽ bị tràn số, sau đó chia 6 vẫn ra 1 số tràn toé loe. Thực ra nếu bạn biết 2000 * 1999 * 1998 / 6 < 2^31-1 cũng chẳng làm được gì, C++ tính từ trái sang phải và số đã tràn ở chỗ phép nhân 3 số rồi.

Nhưng nếu để n là long long, kết quả của phép tính nhân 3 số (và dĩ nhiên cả phép chia) vẫn trong khoảng giới hạn của biến.

evai55 viết 17:52 ngày 01/10/2018

Tức là phép toán biến long long sẽ cho ra kết quả long long đúng không ạ?

HK boy viết 17:44 ngày 01/10/2018

Về cơ bản là vậy. Nhưng nếu bạn tự dưng thích viết

cout << 1*2*3/6.0f << endl;

thì kết quả sẽ có kiểu float.

Bài liên quan
0