2012-06-14 41 views
7

nếu x = 3 và z chưa được gán,
tại sao z = x-- - --x đánh giá là 2?nếu x = 3 và z được bỏ gán, tại sao z = x-- - --x đánh giá thành 2?

giáo sư của tôi đang giảng về điều này vào lúc này và tôi hiện đang bị mắc kẹt với tình huống khó xử này. Thật không may, không ai có thể giải thích lý do tại sao nó xảy ra.

+1

'x— - --x' là gì? – dtsg

+0

x trong giảm phân đoạn trừ x trước khi giảm – arscariosus

+4

là 'C#' hoặc đây là một 'JavaScript'? Vui lòng chọn đúng thẻ. – Tigran

Trả lời

17

trên x--, x = 3 và sau đó là 2. trên --x, x = 1, bởi vì chất nền (từ 2) được thực hiện trước.

Do đó, 3 - 1 = 2.

+1

plz tinh chỉnh câu trả lời của bạn ... tôi vẫn không nhận được – Talha

+0

Chỉ cần tò mò: không C# đảm bảo thứ tự mà biểu thức được đánh giá? Làm thế nào để chúng ta biết rằng sau khi giảm xuống xảy ra trước? –

+0

@torrentialcoding Bởi vì có, nó "đảm bảo" điều đó. Nó chỉ là cách nó hoạt động, thực sự. Tiền tố được định nghĩa để được thực hiện Pre-hoạt động và Postfix được định nghĩa để được thực hiện sau hoạt động. – SimpleVar

8

Dưới đây là thứ tự của các hoạt động, minh họa cho sự hiểu biết tốt hơn:

  • x - - --x Giữ giá trị của x (cho phép gọi nó tmpA). tmpA là 3.
  • x - - --x Giảm x. Hiện tại là 2.
  • x-- - - x Giảm x. Hiện tại là 1.
  • x-- - - x Giá trị giữ của x (cho phép gọi nó là tmpB). tmpB là 1.
  • x-- - --x Thực hiện chỉ dẫn từ các giá trị được tính. 3 - 1 = 2.

Các -- prefix nghĩa là sụt lần sẽ được thực hiện trước khi đánh giá sự biểu hiện và postfix -- nghĩa là sụt lần sẽ được thực hiện sau khi đánh giá sự biểu hiện.

+1

@downvotwer Chăm sóc để giải thích? – SimpleVar

+0

@ Yorye: Tôi đã sửa đổi đoạn cuối cùng thành (tôi nghĩ) làm cho nó rõ ràng hơn. Chỉnh sửa mới nhất của bạn xóa sạch. Nếu đó là cố ý, không phải lo lắng, nhưng nếu không bạn có thể xem xét sự khác biệt và khôi phục bản chỉnh sửa. –

+0

Tôi đã thực sự chỉnh sửa nó cùng một lúc để mã '--prefix' và' postfix - 'mà tôi nghĩ là khá dễ hiểu. Tôi đã không cố gắng làm hỏng bản chỉnh sửa của bạn - và tôi thực sự thích bản chỉnh sửa đầu tiên của bạn - tôi không biết bạn có thể sử dụng các thẻ HTML cơ bản, điều này khiến tôi thoát khỏi tình huống và tình huống vô lý đó. Tôi không nghĩ rằng cấu trúc câu chỉnh sửa cuối cùng của bạn là rất dễ hiểu, nhưng tôi sẽ rất vui nếu bạn chỉnh sửa câu trả lời của tôi một lần nữa để bạn có thể nhận được tín dụng cho những cải tiến của mình :) – SimpleVar

5

Ok, nó khá đơn giản:

hãy thêm dấu ngoặc:

z = (x--) - (--x)

^^ đây là cách biên dịch thấy mã của bạn sau khi tokenizing.

Compiler đánh giá phương trình (phần bên phải) từ trái sang phải

Bây giờ,

x-- bằng POP giá trị của x và sau đó giảm nó và đẩy lùi giá trị vào một ký ức. Ok, cho phép làm điều đó:

Giá trị hiện tại của X là 3, giảm đi là 2 - vì vậy, trong phương trình chúng ta sẽ nhận được 3, nhưng X sẽ chứa giá trị mới 2.

--x bằng giảm giá trị giá trị X và sau đó POP giá trị này vào phương trình. Hãy làm điều đó:

Giá trị hiện tại của X là 2 (vì thao tác trước đó đã giảm) và bây giờ chúng tôi muốn giảm lại một lần nữa. 2-1 = 1, hiểu rồi.

Bây giờ, quay lại toàn bộ phương trình: z = (3) - (1) = 2.

Các vấn đề liên quan