Đầu ra kỳ lạ khi tính tổng 1 << 2 và 1 << 3 trong C ++


8

Vì vậy, tôi chỉ đang thử một số thao tác bit trong C ++. Đây là những gì tôi đã cố gắng:

int a = 1<<2;
cout<<a;

Điều này cho đầu ra như 4.

int a = 1<<3;
cout<<a;

Điều này cho đầu ra là 8

Nhưng khi tôi làm:

int a = 1<<2 + 1<<3;
cout<<a;

Nó cho đầu ra như 64 . Tại sao như vậy?

Tôi cũng đã thử:

int a = 1<<2;
int b = 1<<3;
cout<<a + b;

Mà cho đầu ra 12như mong đợi.


4
<<có mức độ ưu tiên thấp hơn +, 1<<2 + 1<<3=1<<(2 + 1)<<3
LF

Đó là bởi vì 1<<2 + 1<<3thực sự là vậy 1<< 2+1 <<3. Đừng bị đánh lừa bởi khoảng trắng.
Pete Becker

Như một quy tắc chung, sử dụng dấu ngoặc trong các trường hợp như vậy. Chúng có thể không phải lúc nào cũng cần thiết, nhưng chúng làm tăng khả năng đọc và giảm nguy cơ mắc các lỗi đó. Hơn nữa, bạn sẽ không cần phải học mọi trường hợp ưu tiên người vận hành.
RHertel

Câu trả lời:


7

Điều này là do bổ sung có quyền ưu tiên toán tử cao hơn bithift. Nói cách khác, ví dụ thứ hai của bạn tương đương với1 << (2 + 1) << 3

Hơn nữa, vì bithifting là liên kết trái, nó giống như (1 << (2 + 1)) << 3. Điều này đơn giản hóa 8 << 3, đó là 64.


6

Đó là về quyền ưu tiên của nhà điều hành

+có mức độ ưu tiên cao hơn các toán tử thay đổi, do đó 1<<2 + 1<<3được thực hiện 1 << (2 + 1) << 3tương tự 1 << 6 == 64(vì <<liên kết trái , như bạn có thể thấy trong bảng ưu tiên trong liên kết ở trên)

Đó cũng là lý do tại sao cout<<a + b;hoạt động, bởi vì nó được phân tích cú pháp cout<<(a + b);, nếu không, bạn sẽ gặp một số lỗi như "không thể thêm số vào luồng"


3

Các +nhà khai thác có độ ưu tiên cao hơn <<nhà điều hành, vì vậy đây là dòng đang được đánh giá:

int a = (1<<(2 + 1))<<3;

Bạn nên nhóm nó như thế này với dấu ngoặc đơn:

int a = (1<<2) + (1<<3);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.