2013-02-10 38 views
11

K & R Second Edition (trang 71) - Tôi phải bỏ lỡ giải thích:dấu chấm hỏi nhà điều hành trong các biểu thức

sign = (s[i] == '-') ? -1 : 1; 

Bối cảnh của việc này là một chức năng có thể chuyển đổi một chuỗi thành một đôi. Phần này đặc biệt xuất hiện sau khi chức năng bỏ qua khoảng trắng. tôi suy ra nó là kiểm tra giá trị tích cực hay tiêu cực, và lưu nó như một trong hai -1 hoặc +1 để chuyển đổi dấu ở phần cuối của hàm ... return sign * val /power;

Tôi muốn làm tốt hơn so với suy luận. .. Tôi đặc biệt không chắc chắn về những gì các ?: 1 đang làm ở đây (hoặc bất cứ nơi nào, cho rằng vấn đề).

Dường như có vẻ như tuyên bố trừu tượng if. Trường hợp ? kiểm tra sự thật và :else ... thì sao? Có giới hạn ở if/else không?

Tôi là người mới bắt đầu và tôi đã không đi qua cú pháp biểu thức này trước đây, vì vậy tôi tự hỏi nếu có một lý do cụ thể nó dường như thường được thay thế bằng một chính thức if/else --bên cạnh, có lẽ, dễ đọc?

Trả lời

12

Nó loại có vẻ như một bản tóm tắt câu lệnh if.

Đúng vậy. Điều này được gọi là "toán tử điều kiện bậc ba".

Các bình thường if công trình trên báo cáo, trong khi các nhà điều hành có điều kiện hoạt động trên biểu.


tôi tự hỏi nếu có một lý do cụ thể nó dường như thường được thay thế bằng một hình thức if/else - bên cạnh đó, có lẽ, dễ đọc?

Có những trường hợp phân nhánh trên báo cáo là không đủ và bạn cần phải làm việc ở cấp độ biểu thức.

Ví dụ, hãy xem xét khởi:

const int foo = bar ? 5 : 3; 

này không thể được viết bằng một bình thường if/else.


Dù sao, những người đang nói đó là tương đương với if/else đang được chính xác. Mặc dù hội đồng được tạo thường giống nhau nhưng chúng không tương đương và không được xem là phiên bản viết tắt của if. Chỉ cần đặt, sử dụng if bất cứ khi nào có thể và chỉ sử dụng toán tử có điều kiện khi bạn cần phân nhánh trên biểu thức.

+0

Được chọn làm câu trả lời vì bạn đã giải quyết lý do tại sao, cũng như những gì. – d0rmLife

2

Đây là toán tử bậc ba. (s[i] == '-') ? -1 : 1; trả về -1 nếu s[i] == '-'1 nếu không. Giá trị này sau đó được gán cho sign. Nói cách khác, một cách lâu hơn để viết những dòng này sẽ là:

int sign; 

if(s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
+0

"Toán tử bậc ba" không hoàn toàn chính xác, tên riêng của nó là "toán tử có điều kiện". –

0
sign = (s[i] == '-') ? -1 : 1; 

là viết tắt cho:

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
1

?:có điều kiện khai thác trong C.

tại của bạn ví dụ: nó sẽ tạo ra kết quả tương tự như tuyên bố này if:

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
12

Nó loại có vẻ như một bản tóm tắt câu lệnh if, nơi ? tra chân lý và : là khác ... là như vậy?

Vâng, gần như vậy. Nó được gọi là "toán tử điều kiện" (đôi khi không hoàn toàn được gọi chính xác là "toán tử bậc ba", vì nó là toán tử bậc ba duy nhất trong C). Tuy nhiên, đây không phải là tuyên bố , đó là biểu thức , nó có giá trị. Nó đánh giá đối số thứ hai của nó nếu đối số đầu tiên đánh giá là true và đối số thứ ba của nó nếu nó là false. Do đó

sign = (s[i] == '-') ? -1 : 1; 

tương đương với

if (s[i] == '-') { 
    sign = -1; 
} else { 
    sign = 1; 
} 
+0

+1 cho sự hữu ích. Câu trả lời này thực sự giải thích cách "toán tử điều kiện" được diễn giải. Cảm ơn. – d0rmLife

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