Tại sao C và C ++ cho phép biểu thức (int) + 4 * 5?


86
(int) + 4*5;

Tại sao điều này (thêm một kiểu với một giá trị) có thể thực hiện được? (đã thử với g ++ và gcc.)

Tôi biết rằng điều đó không có ý nghĩa (và không ảnh hưởng gì), nhưng tôi muốn biết tại sao điều này lại có thể.


19
tương tự như(int)-4*5
P__J hỗ trợ phụ nữ ở Ba Lan

45
Có một công cụ hữu ích được gọi là cppinsightsgiúp hiểu mã trông như thế nào từ quan điểm giao diện người dùng của trình biên dịch. Nó cũng có một phiên bản trực tuyến, bạn có thể xem những gì nó nói về ví dụ của bạn (giống 'parenthesization' như câu trả lời của bạn đã được đưa ra)
Nikita Kniazev

22
Tuyên bố này là tương đương với +(int)+ 4*5;-(int)- 4*5;-+-+-(int)-+-+- 4*5;và ít nên thơ;
chqrlie

16
Bạn đố bạn phần nào? Đối với tất cả những gì tôi biết, bạn đang hỏi tại sao bạn được phép viết 5 mà không chỉ ra dấu hiệu.
Carsten S

5
C ++ có nên cảnh báo bạn rằng phôi kiểu C không được khuyến nghị trong C ++ không?
Mr Lister

Câu trả lời:


141

+đây là toán +tử một ngôi , không phải toán tử cộng nhị phân . Không có sự bổ sung nào xảy ra ở đây.

Ngoài ra, cú pháp (int)được sử dụng để đánh máy.

Bạn có thể đọc lại tuyên bố đó dưới dạng

(int) (+ 4) * 5;    

được phân tích cú pháp là

((int) (+ 4)) * (5);    

mà nói,

  1. Áp dụng toán +tử một ngôi cho giá trị hằng số nguyên 4.
  2. đánh máy cho một int
  3. nhân với toán hạng 5

Điều này tương tự như (int) (- 4) * (5);, trong đó việc sử dụng toán tử một ngôi quen thuộc hơn.

Trong trường hợp của bạn, đơn nguyên +và dàn diễn viên int- cả hai đều dư thừa.


50
"Đúc", không phải "đánh máy". Đánh máy là một cái gì đó xảy ra với các diễn viên.
Keith Thompson

8
(+ 4)không được tạo toán hạng+4 , nó có nghĩa là áp dụng một ngôi +cho toán hạng 4, điều này thực sự là không phù hợp trong trường hợp của OP, nhưng có thể gây ra thăng hạng số nguyên hoặc phân rã mảng trong các trường hợp khác. Ví dụ char c = 0; sizeof +c == sizeof ccó lẽ là sai và sizeof +"a"có lẽ không phải 2.
chqrlie

7
"cả hai đều là dư thừa" - toàn bộ điều là không cần thiết, giống như 42;:-)
paxdiablo

11
Tôi thấy không có gì sai khi sử dụng thuật ngữ Truyền kiểu. Có vẻ như tôi không phải là người duy nhất .
Ben

14
@Ben Typecasting không phải là kiểu truyền.
Kenneth K.

40

Điều này được hiểu là ((int)(+4)) * 5. Đó là, một biểu thức +4(một toán tử cộng một bậc được áp dụng cho một chữ 4), được ép kiểu để nhập intvới kiểu ép kiểu C và kết quả được nhân với 5.

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.