21 Câu hỏi: Toán tử - -> trong C ++ là gì?

câu hỏi được tạo ra tại Mon, Feb 13, 2017 12:00 AM

Sau khi đọc Các tính năng ẩn và góc tối của C ++ /STL vào ngày 49 310, tôi hoàn toàn ngạc nhiên khi đoạn mã sau được biên dịch và hoạt động trong cả Visual Studio 2008 và G ++ 4.4.

Đây là mã:

 49 310

Tôi cho rằng đây là C, vì nó cũng hoạt động trong GCC. Điều này được xác định trong tiêu chuẩn và nó đến từ đâu?

    
8347
  1. Hoặc thậm chí chỉ là khoảng cách phù hợp ... Tôi không nghĩ rằng tôi đã từng thấy một khoảng trắng giữa biến và 49 310 hoặc 49 310 trước ...
    2009-10-29 07: 09: 47Z
  2. Toán tử "đi tới" này có thể được hoàn nguyên (0 < - x). Và cũng có một toán tử "chạy đến" (0 < ---- x). Geez, điều thú vị nhất tôi từng nghe về cú pháp c ++ =) +1 cho câu hỏi.
    2009-10-29 07: 27: 21Z
  3. Đủ vui, mặc dù cách hiểu rất sai, nhưng nó mô tả chính xác những gì mã làm. :)
    2009-11-11 13: 51: 39Z
  4. Hãy tưởng tượng các khả năng cú pháp mới: 49 310, 49 310. Nếu bạn cảm thấy xấu xa, bạn có thể thực hiện 49 310 và 49 310 (và 49 310) và viết 49 310 Oh, nhân loại ...
    2010-03-04 07: 07: 25Z
  5. Mở ra khả năng của một cách mã hóa hoàn toàn mới, đáng để hy sinh một vài cảnh báo của trình biên dịch cho: bool CheckNegative (int x) {return x < 0? đúng sai ); }
    2012-05-28 11: 12: 58Z
21 Câu trả lời                              21                         

49 310 không phải là toán tử. Trên thực tế, đó là hai toán tử riêng biệt, 49 310 và 49 310.

Mã của điều kiện giảm 49 310, trong khi trả về giá trị ban đầu (không giảm) của 49 310, sau đó so sánh giá trị ban đầu với 49 310 bằng toán tử 49 310.

Để hiểu rõ hơn, tuyên bố có thể được viết như sau:

 49 310     
8030
2018-12-23 15: 46: 05Z
  1. Một lần nữa, nó trông giống như một loại toán tử phạm vi trong ngữ cảnh đó.
    2009-10-29 07: 14: 52Z
  2. Nói rằng x bị giảm sau và sau đó được so sánh với 0 giống như nói x bị giảm sau khi được so sánh với 0
    2009-10-29 08: 35: 27Z
  3. Tôi không nghĩ nó giống nhau. Tôi nghĩ rằng từ "sau đó" ngụ ý có một thứ tự (sau khi giảm dần, giá trị của x là một ít hơn). Tôi nghĩ rằng người ta có thể nói "Bạn đang đăng giảm x và sau đó so sánh giá trị cũ của nó và 0 ..." để làm cho nó rõ ràng hơn. Nhưng dù sao đây cũng là nitpicking. Chúng ta đều biết ý nghĩa của nó.
    2010-01-30 17: 42: 40Z
  4. Trong Java, nó cũng biên dịch :)
    2013/02/12 08: 07: 27Z
  5. Tên của nó, @Jay, là phong cách lập trình xấu :-) Điều này được chứng minh bằng thực tế câu hỏi đã được hỏi ngay từ đầu. Nó có ý nghĩa hơn nhiều đối với các nhà khai thác liên kết bằng văn bản với thứ mà họ đang vận hành thay vì một cái gì đó không liên quan, vì vậy 49 310 sẽ có nhiều khả năng hơn. Nó cũng làm cho rõ ràng hơn những gì đang diễn ra (ít nhất là trong trình chỉnh sửa phông chữ cố định) có nghĩa là dấu ngoặc đơn trong câu trả lời này sẽ không cần thiết.
    2016-02-15 01: 28: 00Z

Hoặc cho một cái gì đó hoàn toàn khác ... x trượt xuống 0

 49 310

Không quá toán học, nhưng ... mỗi bức tranh vẽ một ngàn chữ ...

    
2771
2018-10-09 06: 55: 47Z
  1. Xin lỗi, tôi không nhận được cái này. Làm thế nào để nó hoạt động?
    2012/03/07 10: 48: 26Z
  2. @ mafutrct - Theo tôi nhớ thì \trong C chỉ nối thêm dòng tiếp theo như thể không có ngắt dòng. \S ở đây về cơ bản không làm gì cả.
    2012 /03-10 04: 37: 36Z
  3. IIRC, K & RC cho phép khoảng trắng giữa '-'s trong toán tử giảm dần, trong trường hợp đó bạn có thể có dấu gạch chéo ở giữa, trông sẽ có dấu gạch chéo ở giữa thậm chí mát hơn. :)
    2013-07-13 09: 23: 17Z
  4. @ ArnavBorborah đó là một biểu thức cũ có nghĩa là 49 310, được sử dụng như một trò đùa trong ngữ cảnh này. (thực tế có 2 từ khóa 49 310 và 49 310)
    2016-09-10 11: 36: 46Z
  5. À đúng, toán tử trượt tối nghĩa. Làm sao tôi có thể quên!
    2017-10-27 10: 00: 48Z

Đó là một toán tử rất phức tạp, do đó, ngay cả ISO /IEC JTC1 (Ủy ban kỹ thuật chung 1) đặt mô tả của nó trong hai phần khác nhau của Tiêu chuẩn C ++.

Đùa sang một bên, chúng là hai toán tử khác nhau: 49 310 và 49 310 được mô tả tương ứng trong §5.2.6 /2 và §5.9 của Tiêu chuẩn C ++ 03.

    
2301
2017/03/02 06: 49: 17Z

Nó tương đương với

 49 310

49 310 (giảm dần bài) tương đương với 49 310, do đó, mã chuyển đổi thành:

 49 310     
1219
2018-11-06 17: 27: 12Z
  1. Điều này không hoàn toàn đúng. Giá trị của x bên trong thân vòng lặp là khác nhau trong trường hợp thứ hai. Câu lệnh gán trong ví dụ của bạn phải là ở trên logic để nó tương đương. Postfix - trừ 1, nhưng so sánh sẽ xảy ra với giá trị từ trước phép trừ.
    2018-10-16 16: 03: 48Z
  2. @ uliwitness Đây là những thứ thực sự tương đương. Sẽ là sai nếu tiền tố đang được sử dụng: 49 310 Trong trường hợp này, 49 310 bị giảm trước logic. Trong postfix, logic được thực thi trước khi giảm và do đó cả hai mẫu đều tương đương nhau. Vui lòng viết chúng lên trong 49 310 và kiểm tra chúng.
    2019-01 /02 19: 36: 20Z
  3. Chúng vẫn không tương đương. Sau vòng lặp thứ nhất, x là -1 (hoặc tràn trong trường hợp không dấu), sau vòng thứ hai, nó là 0. (Giả sử x bắt đầu không âm, không lặp lại sửa đổi x hoặc ngắt hoặc khóa)
    2019-01-15 14: 56: 57Z

49 310 có thể về 0 thậm chí nhanh hơn theo hướng ngược lại:

 49 310

49 310

Bạn có thể kiểm soát tốc độ bằng một mũi tên!

 49 310

49 310

;)

    
1049
2017-10-11 02: 51: 48Z
  1. hệ điều hành nào, loại đầu ra này được tạo ra, tôi đang sử dụng ubfox 12.04 trong đó tôi có thông báo lỗi
    2015-01-19 12: 13: 36Z
  2. Mặc dù điều đó là hiển nhiên, nhưng với mọi người mới biết về C ++, hãy đọc nó: đừng làm điều đó. Chỉ cần sử dụng phép gán tăng nếu bạn có nhu cầu tăng /giảm nhiều hơn một.
    2015-03-26 02: 41: 40Z
  3. Không có "laser". while (0 > - - - - - - - - - ---------- x) ... cùng một đầu ra.
    2016-03-09 21: 54: 16Z
  4. @ doc Nó biên dịch trong c ++, nhưng không phải trong c.
    2016-03-25 14: 58: 46Z

Đó là

 49 310

Chỉ là không gian làm cho mọi thứ trông buồn cười, 49 310 giảm và 49 310 so sánh.

    
528
2018-03-08 17: 02: 25Z

Việc sử dụng 49 310 có liên quan lịch sử. Giảm là (và vẫn còn trong một số trường hợp), nhanh hơn so với tăng trên kiến ​​trúc x86. Sử dụng 49 310 cho thấy 49 310 sẽ chuyển sang 49 310 và hấp dẫn những người có nền tảng toán học.

    
398
2009-11-18 12: 47: 41Z
  1. Không chính xác. Giảm và tăng mất cùng một khoảng thời gian, lợi ích của việc này là so sánh với 0 rất nhanh so với so sánh với một biến. Điều này đúng với nhiều kiến ​​trúc, không chỉ x86. Bất cứ điều gì với một hướng dẫn JZ (nhảy nếu không). Chọc xung quanh bạn có thể tìm thấy nhiều vòng lặp "cho" được viết ngược để lưu chu kỳ so sánh. Điều này đặc biệt nhanh trên x86 vì hành động giảm biến đã đặt cờ 0 một cách thích hợp, do đó bạn có thể phân nhánh mà không cần phải so sánh rõ ràng biến.
    2009-12-30 05: 16: 46Z
  2. Chà, giảm dần về 0 có nghĩa là bạn chỉ phải so sánh với 0 trên mỗi vòng lặp, trong khi lặp về n có nghĩa là so sánh với n mỗi lần lặp. Cái trước có xu hướng dễ dàng hơn (và trên một số kiến ​​trúc, được tự động kiểm tra sau mỗi hoạt động đăng ký dữ liệu).
    2010-04-12 15: 07: 58Z
  3. @ burrito Mặc dù tôi không đồng ý, các vòng lặp dựa trên các giá trị khác không thường được dự đoán gần hoàn hảo.
    2014-01-11 09: 05: 12Z
  4. Tăng và giảm đều nhanh như nhau, có thể trên tất cả các nền tảng (chắc chắn là trên x86). Sự khác biệt là trong việc kiểm tra điều kiện kết thúc vòng lặp. Để xem bộ đếm đã đạt đến 0 có thực sự miễn phí hay không - khi bạn giảm giá trị, cờ số 0 được đặt trong bộ xử lý và để phát hiện điều kiện kết thúc, bạn chỉ cần kiểm tra cờ đó trong khi bạn tăng thao tác so sánh trước điều kiện kết thúc có thể được phát hiện.
    2015 /02-18 11: 14: 01Z
  5. Tất nhiên, tất cả điều này là không cần thiết trong những ngày này, vì trình biên dịch hiện đại có thể tự động hóa và đảo ngược các vòng lặp.
    2015 /02-20 03:53:56Z
 49 310

là cách phân tích cú pháp.

    
345
2009-11-19 19: 46: 56Z

Hoàn toàn đam mê, nhưng tôi sẽ sử dụng cái này:

 49 310     
333
2011-12-03 02: 33: 05Z
  1. Tôi hy vọng tôi không bao giờ gặp phải bất kỳ mã nguồn nào của bạn
    2012-08-15 01: 44: 31Z
  2. @ Mk12 Đó không phải là mã nguồn ... đó là chữ tượng hình: -)
    2012-09-07 03: 27: 35Z
  3. @ SAFX - Nó sẽ là chữ tượng hình hoàn hảo với dấu ngoặc Ai Cập
    2012-11-14 10: 00: 02Z
  4. Điều này không biên dịch. C không phải là Pascal, trong đó phần bên trong của 49 310 là danh sách câu lệnh. Trong C, nó là một khối, vì vậy nó phải là 49 310.
    2016-09-11 02: 20: 23Z
  5. @ EJP nó biên dịch. Cú pháp là 49 310. Phải nói rằng, tôi hy vọng nó được hiểu tôi có nghĩa là ví dụ như một trò đùa.
    2016-10-18 17: 28: 10Z

Một cuốn sách tôi đã đọc (Tôi không nhớ chính xác cuốn sách nào) đã nêu: Trình biên dịch cố gắng phân tích các biểu thức thành mã thông báo lớn nhất bằng cách sử dụng quy tắc bên trái.

Trong trường hợp này, biểu thức:

 49 310

Phân tích cú pháp thành mã thông báo lớn nhất:

 49 310

Quy tắc tương tự áp dụng cho biểu thức này:

 49 310

Sau khi phân tích cú pháp:

 49 310

Tôi hy vọng điều này sẽ giúp hiểu biểu thức phức tạp ^^

    
304
2015-04-23 09: 02: 58Z
  1. Giải thích thứ hai của bạn không chính xác. Trình biên dịch sẽ thấy 49 310 và nghĩ 49 310, không biên dịch vì 49 310 không trả về giá trị.
    2010-05-05 15: 26: 03Z
  2. Ngoài ra, 49 310 và 49 310 là hai mã thông báo riêng biệt.
    2010/07/02 19: 20: 05Z
  3. Điều này được gọi là Munch tối đa .
    2014/03/13: 09: 26Z
  4. @ DoctorT: nó vượt qua từ vựng. chỉ có ngữ nghĩa mới có khả năng phát ra lỗi đó. vì vậy lời giải thích của anh ấy là đúng.
    2014-09-01 03: 34: 53Z
  5. Miễn là bạn nghĩ 49 310 là một toán tử (nghĩa là câu hỏi được hỏi), câu trả lời này không hữu ích chút nào - bạn sẽ nghĩ rằng mã thông báo 2 là 49 310, không chỉ 49 310. Nếu bạn biết rằng 49 310 không phải là nhà điều hành, có lẽ bạn không gặp vấn đề gì khi hiểu mã trong câu hỏi, vì vậy, trừ khi bạn có một câu hỏi hoàn toàn khác, tôi không thực sự chắc chắn làm thế nào điều này có thể hữu ích.
    2015-05-22 12: 33: 43Z

Điều này hoàn toàn giống với

 49 310

cho các số không âm

    
253
2015-04-30 22: 48: 34Z
  1. Đây có phải là 49 310 không?
    2011-12-04 21: 32: 19Z
  2. @ DoctorT đó là những gì 49 310 dành cho
    2013-03-23 ​​18: 39: 13Z
  3. @ MateenUlhaq, đó là sai theo tiêu chuẩn biểu thức 49 310 có hành vi không xác định theo §1.9.15
    2015-06-19 02: 02: 01Z
  4. Nếu đang sử dụng 49 310, nó sẽ sử dụng 49 310
    2019-02-21 22: 01: 27Z
Dù sao, bây giờ chúng tôi có một nhà điều hành "đi đến". 49 310 dễ dàng được ghi nhớ theo hướng và "trong khi x về không" có nghĩa là thẳng.

Hơn nữa, nó hiệu quả hơn một chút so với 49 310 trên một số nền tảng.

    
230
2013 /02-28 17: 28: 13Z
  1. Luôn luôn đúng, đặc biệt khi giá trị của x là âm.
    2009-11-13 03: 22: 41Z
  2. Phiên bản khác không làm điều tương tự - với 49 310 phần thân của vòng lặp được thực thi với 9,8, .., 0 trong khi phiên bản khác có 10, 9, .., 1. Thật khó để thoát một vòng lặp xuống 0 bằng một biến không dấu khác.
    2010-06-21 08: 57: 44Z
  3. Tôi nghĩ rằng điều này hơi sai lệch ... Chúng tôi không có toán tử "đi đến" theo nghĩa đen, vì chúng tôi cần thêm 49 310 để thực hiện công việc gia tăng.
    2013-06-15 02: 49: 10Z
  4. @ Josh: thực sự, tràn cho hành vi không xác định cho 49 310, do đó, nó có thể dễ dàng ăn con chó của bạn như đưa 49 310 về 0 nếu nó bắt đầu âm.
    2013-12-06 06: 57: 56Z
  5. Đây là một thành ngữ rất quan trọng đối với tôi vì lý do được đưa ra trong comnmet bởi @PeteKirkham, vì tôi thường cần phải giảm các vòng lặp trên số lượng không dấu . (Để so sánh, thành ngữ bỏ qua các bài kiểm tra về 0, chẳng hạn như viết 49 310 thay vì không ký 49 310, không mua gì cho bạn và đối với tôi rất nhiều cản trở khả năng đọc.) Nó cũng có thuộc tính dễ chịu mà bạn chỉ định thêm một hơn chỉ mục ban đầu, thường là những gì bạn muốn (ví dụ: đối với một vòng lặp trên một mảng bạn chỉ định kích thước của nó). Tôi cũng thích 49 310 mà không có không gian, vì điều này làm cho thành ngữ dễ nhận ra.
    2014-08-30 20: 08: 39Z

Mã này trước tiên so sánh x và 0 và sau đó giảm x. (Cũng đã nói trong câu trả lời đầu tiên: Bạn đang giảm sau x và sau đó so sánh x và 0 với toán tử 49 310.) Xem đầu ra của mã này:

 49 310

Trước tiên, chúng tôi trước tiên so sánh và sau đó giảm dần bằng cách thấy 0 trong đầu ra.

Nếu chúng tôi muốn giảm đầu tiên và sau đó so sánh, hãy sử dụng mã này:

 49 310

Đầu ra đó là:

 49 310     
212
2016-01-03 17: 48: 14Z

Trình biên dịch của tôi sẽ in ra 9876543210 khi tôi chạy mã này.

 49 310

Như mong đợi. 49 310 thực sự có nghĩa là 49 310. Bài viết 49 310 giảm 49 310.

 49 310

là một cách viết khác nhau cho cùng một điều.

Thật tuyệtmặc dù bản gốc trông giống như "while x đi về 0".

    
167
2015-04-30 22: 49: 12Z
  1. Kết quả chỉ không được xác định khi bạn tăng /giảm cùng một biến nhiều lần trong cùng một câu lệnh. Nó không áp dụng cho tình huống này.
    2010-05-05 15: 30: 19Z
  2. .
2015-05-22 12: 28: 30Z

Có một khoảng trống bị thiếu trong khoảng từ 49 310 đến 49 310. 49 310 được giảm dần, nghĩa là giảm dần sau khi kiểm tra điều kiện 49 310.

    
138
2010-11-22 19: 02: 21Z
  1. Không gian trống bị thiếu - C (++) bỏ qua khoảng trắng.
    2012-08 /02 19: 16: 31Z
  2. @ H2CO3 Điều này nói chung không đúng. Có những nơi phải sử dụng khoảng trắng để phân tách mã thông báo, ví dụ: trong 49 310 so với 49 310.
    2013-04-25 21: 16: 44Z
  3. @ Jens Làm thế nào về: "Không gian bị thiếu - C (++) bỏ qua khoảng trắng không cần thiết."?
    2013-12-04 20: 35: 14Z

49 310 là toán tử giảm và 49 310 là toán tử lớn hơn .

Hai toán tử được áp dụng như một toán tử duy nhất như 49 310.

    
129
2011-10-29 21: 42: 06Z
  1. Họ được áp dụng với tư cách là hai toán tử riêng biệt. Họ chỉ được viết một cách sai lệch để trông giống như "một người duy nhất".
    2016-11-12 17: 56: 09Z

Đó là sự kết hợp của hai toán tử. 49 310 đầu tiên là để giảm giá trị và 49 310 là để kiểm tra xem giá trị có lớn hơn toán hạng bên phải hay không.

 49 310

Đầu ra sẽ là:

 49 310     
123
2015-04-30 22: 50: 01Z

Trên thực tế, 49 310 là giảm sau và với điều kiện đó đang được kiểm tra. Đó không phải là 49 310, đó là 49 310

Lưu ý: giá trị của 49 310 được thay đổi sau khi điều kiện được kiểm tra, vì nó giảm sau. Một số trường hợp tương tự cũng có thể xảy ra, ví dụ:

 49 310     
117
2014-04-12 09: 52: 33Z
  1. Ngoại trừ đó là ++ > khó có thể được sử dụng trong một thời gian (). Toán tử "đi lên ..." sẽ là ++ <, trông không đẹp ở đâu cả. Toán tử - > là một sự trùng hợp hạnh phúc.
    2014-09-01 09: 46: 25Z
  2. 49 310 có thể hoạt động được không?
    2015-06-15 14: 00: 33Z
  3. 2016-11-12 17: 57: 29Z

C C ++ tuân theo quy tắc" tối đa munch ". Giống như cách a --- b được dịch thành 49 310, trong trường hợp của bạn 49 310 dịch thành 49 310.

Điều mà quy tắc nói về cơ bản là đi từ trái sang phải, các biểu thức được hình thành bằng cách lấy tối đa các ký tự sẽ tạo thành một biểu thức hợp lệ.

    
113
2014-04-12 09: 55: 16Z
  1. Đó là những gì OP giả định: rằng "((a) - >)" là munch tối đa. Hóa ra giả định ban đầu của OP là không chính xác: "- >" không phải là toán tử hợp lệ tối đa.
    2014-08-28 00: 41: 45Z
  2. Còn được gọi là phân tích cú pháp tham lam, nếu tôi nhớ chính xác.
    2015-07-11 01: 04: 15Z
  3. @ RoyTinker Tham lam quét. Trình phân tích cú pháp không liên quan gì đến điều này.
    2016-09-11 02: 21: 50Z

Tại sao tất cả các biến chứng?

Câu trả lời đơn giản cho câu hỏi ban đầu chỉ là:

 49 310

Có làm điều tương tự. Không nói rằng bạn nên làm như thế này, nhưng nó cũng làm điều tương tự và sẽ trả lời câu hỏi trong một bài đăng.

49 310 chỉ là viết tắt cho phần trên và 49 310 chỉ là mức bình thường lớn hơn 49 310. Không có bí ẩn lớn!

Ngày nay có quá nhiều người làm cho những điều đơn giản trở nên phức tạp;)

    
26
2018-06-30 10: 10: 56Z
  1. Câu hỏi này không phải là về các biến chứng, mà là về ** Các tính năng ẩn và góc tối của C ++ /STL **
    2016-10-27 15: 32: 01Z
  2. Chương trình ở đây cho đầu ra khác với bản gốc vì x ở đây bị giảm sau printf. Điều đó cho thấy rõ "cách trả lời đơn giản" thường không chính xác.
    2017-05-13 09: 30: 30Z
  3. 49 310 và 49 310
    2017-12-15 18: 33: 22Z
  4. Nó không làm điều tương tự. Di chuyển 49 310 của bạn trước 49 310 sau đó bạn có thể nói "nó cũng làm điều tương tự".
    2019-01-05 17: 05: 49Z
,

Ví dụ:

 49 310

Điều này làm giảm 49 310 và chạy vòng lặp trong khi 49 310 lớn hơn 49 310.

Thông thường, nó sẽ giống như:

 49 310

Cả hai cách, chúng tôi đều làm điều tương tự và đạt được cùng một mục tiêu.

    
23
2019-06-15 19: 35: 13Z
  1. Điều này không chính xác. Mã trong câu hỏi thực hiện: 'test-write-exec' (kiểm tra trước, viết giá trị mới, thực hiện vòng lặp), ví dụ của bạn là 'test-exec-write'.
    2017-07-14 19: 07: 40Z
  2. @ v010dya Đã sửa câu trả lời, bây giờ là 49 310 như trong câu hỏi, cảm ơn vì đã chỉ ra!
    2019-05-12 10: 59: 49Z
  3. @ VladislavToncharov Chỉnh sửa của bạn vẫn sai. Xem của tôi.
    2019-06-15 19: 36: 17Z
comp.lang.c++.moderated
nguồn đặt đây