2014-04-24 25 views
7

Xuất phát từ các ngôn ngữ lập trình khác, tôi hy vọng các báo cáo sau đây cho tất cả sẽ tạo ra cùng một kết quả. Ai đó có thể giải thích tại sao dấu ngoặc đơn tạo sự khác biệt ở đây?Powershell Mảng và Dấu ngoặc đơn

PS D:\> "ab",  "cd" 
ab 
cd 
PS D:\> "a"+"b" , "c"+"d" 
ab cd 
PS D:\> "a"+"b" , ("c"+"d") 
ab cd 
PS D:\> ("a"+"b"), "c"+"d" 
ab 
c 
d 
PS D:\> ("a"+"b"), ("c"+"d") 
ab 
cd 
PS D:\> 
+3

Khám phá Get-Help about_operator_precedence để biết danh sách tất cả các toán tử và ưu tiên tương ứng của chúng trong một biểu thức. – mjolinor

Trả lời

10

Các quy tắc áp dụng như sau:

  • Các , là một nhà điều hành unary hoặc nhị phân tạo ra một mảng của các toán hạng (s), và nó có độ ưu tiên cao hơn các nhà điều hành + .
  • Toán tử + có thể được sử dụng để thêm số, nối chuỗi và ghép nối mảng. Kiểu dữ liệu của toán hạng còn lại xác định loại hoạt động nào được thực hiện. Nếu có thể, toán hạng bên phải được chọn làm kiểu dữ liệu của toán hạng bên trái; nếu không thể, sẽ xảy ra lỗi. *
  • Trường hợp ưu tiên bằng nhau, việc đánh giá diễn ra từ trái sang phải.
  • Mảng được tạo thành chuỗi bằng cách liệt kê các phần tử được phân tách bằng dấu cách.
  • Dấu ngoặc đơn, như bạn mong đợi, có quyền ưu tiên cao hơn bất kỳ toán tử nào, và làm cho biểu thức đính kèm được đánh giá trước bất kỳ thứ gì bên ngoài dấu ngoặc đơn.
  • Kết quả mặc định của đối tượng mảng là danh sách các phần tử, một phần tử trên mỗi dòng.

* Điều đó giải thích kết quả dường như không phù hợp như "foo" + 1 rằng đánh giá để foo1, nhưng 1 + "foo" mang đến cho bạn một lỗi.

Vì vậy, hãy xem xét các trường hợp thử nghiệm của bạn và phân tích những gì xảy ra sau khi logic được giải thích ở trên.


Trường hợp I: là

"ab", "cd" 

Cái này rất đơn giản: các nhà điều hành , tạo ra một mảng của hai chuỗi, abbc.


Trường hợp II:

"a" + "b", "c" + "d" 

một Điều này có vẻ phản trực giác trong nháy mắt đầu tiên; điều quan trọng là nhận ra rằng , được đánh giá trước +. Đây là cách kết quả thu được, từng bước:

  1. "b", "c" được đánh giá đầu tiên (do , 's ưu tiên hơn +), tạo ra một mảng của các yếu tố bc.
  2. Tiếp theo, toán tử + được áp dụng cho "a" và mảng được tạo ở bước 1. Vì toán hạng bên trái "a" là một chuỗi, một chuỗi nối được thực hiện.
  3. Để nối một chuỗi với một mảng, mảng được truyền dưới dạng một chuỗi. Một mảng bc sẽ trở thành chuỗi b c.
  4. Ghép nối a với b c sản lượng ab c.
  5. Cuối cùng, ab c được nối với d để tạo ra kết quả cuối cùng, ab cd

Trường hợp III:

"a"+"b" , ("c"+"d") 

Điều này mang lại kết quả tương tự bằng cách trùng hợp ngẫu nhiên; việc đánh giá xảy ra khác nhau:

  1. ("c"+"d") được đánh giá đầu tiên, do các dấu ngoặc đơn. Đó là một chuỗi nối vani đơn giản, kết quả là chuỗi cd.
  2. Tiếp theo, toán tử , được áp dụng cho "b" và chuỗi từ bước 1, tạo một mảng các thành phần bcd. (Điều này được đánh giá trước "a" + "b", có độ ưu tiên cao hơn +.)
  3. Sau đó, các nhà điều hành + được áp dụng cho "a" và mảng tạo ở bước 2. Kể từ khi toán hạng bên trái là một chuỗi, một chuỗi nối được thực hiện.
  4. Mảng bcd được truyền dưới dạng chuỗi b cd.
  5. Các chuỗi ab cd được ghép nối, dẫn đến kết quả cuối cùng là ab cd.

Trường hợp IV:

("a" + "b"), "c" + "d" 

Đây là trường hợp thử nghiệm thú vị nhất, và có lẽ là phản trực quan nhất, bởi vì nó mang lại kết quả có thể xuất hiện không phù hợp. Dưới đây là cách được đánh giá:

  1. Tương tự như trường hợp III bước 1, ("a" + "b") được đánh giá đầu tiên, sản xuất chuỗi ab.
  2. Các , được áp dụng cho các chuỗi từ bước 1 và "c", tạo ra một mảng của các yếu tố abc.
  3. Toán tử + được áp dụng cho mảng từ bước 2 và mã thông báo tiếp theo, "d". Lần này, toán hạng bên trái là một mảng, do đó, một phép nối mảng được thực hiện.
  4. Toán hạng chuỗi "d" được truyền dưới dạng mảng của một phần tử.
  5. Hai mảng được nối vào một mảng các thành phần ab, cd.

Trường hợp V:

("a" + "b"), ("c" + "d") 

Bởi bây giờ, nó phải là dễ dàng để xem những gì xảy ra ở đây:

  1. ("a" + "b") được đánh giá là chuỗi ab.
  2. ("c" + "d") được đánh giá là chuỗi cd.
  3. Các , được áp dụng cho các chuỗi từ bước 1 và 2, tạo một mảng là abcd.

Bạn có thể xem precedence table với lệnh

Get-Help about_Operator_Precedence 

(Help tên doc có thể tab hoàn thành, vì vậy để tiết kiệm đánh máy, đó là help about_opTABTAB)

+0

Cảm ơn lời giải thích tuyệt vời. Điều này hoàn toàn xóa nó lên cho tôi. Về cơ bản, nó đã đánh giá các biểu thức như sau: '" a "+ (" b "," c ") +" d "' và '((" a "+" b ")," c ") +" d " ' – sparebytes

+0

Tuyệt. Tuy nhiên, tôi sẽ thêm phân tích các ví dụ, vì các câu hỏi và câu trả lời của SO có ý định hữu ích như tài liệu tham khảo cho những người tìm kiếm trong tương lai. –

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