Cái gì '?' làm gì trong C ++?


80
int qempty()
{
    return (f == r ? 1 : 0);
}

Trong đoạn mã trên, " ? " Có nghĩa là gì? Chúng ta có thể thay thế nó bằng gì?


22
Tất nhiên, trong trường hợp cụ thể này, bạn chỉ có thể thay thế nó bằng return f == r;
Nhật thực

28
Trong nhận xét, nó được sử dụng để đặt một câu hỏi.
mmx

6
@Eclipse: Tôi sẽ không dựa vào chuyển đổi ngầm bool-> int nếu tôi có thể tránh nó.
Daniel Daranas

2
@DanielDaranas tại sao không? (Đây là loại câu hỏi dành cho người mới bắt đầu - lời giải thích về nhận xét của bạn dành cho người mới bắt đầu sẽ rất hữu ích và được đánh giá cao.)
Michael Hoffmann

4
@MichaelHoffmann Hành vi của chuyển đổi ngầm trong trường hợp này đã được xác định rõ, vì vậy việc sử dụng nó là hoàn toàn chính xác; xem câu trả lời này để tham khảo tiêu chuẩn. Cá nhân tôi tránh sử dụng các chuyển đổi kiểu ngầm vì tôi nghĩ rằng mã dễ đọc và dễ bảo trì hơn và ít bị lỗi hơn nếu không có chúng. Tôi đã viết chi tiết hơn về nó trong bài đăng trên blog này .
Daniel Daranas

Câu trả lời:


134

Đây thường được gọi là toán tử điều kiện và khi được sử dụng như thế này:

condition ? result_if_true : result_if_false

... nếu conditiongiá trị là thành true, biểu thức sẽ đánh giá thành result_if_true, nếu không, nó sẽ đánh giá thành result_if_false.

Nó là đường cú pháp , và trong trường hợp này, nó có thể được thay thế bằng

int qempty()
{ 
  if(f == r)
  {
      return 1;
  } 
  else 
  {
      return 0;
  }
}

Lưu ý: Một số người gọi ?:nó là " toán tử bậc ba ", bởi vì nó là toán tử bậc ba duy nhất (tức là toán tử nhận ba đối số) trong ngôn ngữ họ đang sử dụng.


Tôi nghĩ chúng có nghĩa ngầm là "toán tử bậc ba (C ++)". Những toán tử bậc ba nào khác tồn tại trong C ++?
sblom

Dành cho bất kỳ ai cần tình yêu có điều kiện: Artima.com/cppsource/foreach.html . eric niebler giải thích cách boost.foreach của anh ấy sử dụng toán tử điều kiện.
Johannes Schaub - litb

4
Trong mã thông thường, nó là đường cú pháp, nhưng nó cho phép bạn thực hiện khởi tạo có điều kiện trong danh sách khởi tạo của constructot.
JohnMcG

@JohnMcG đợi đã, sao? Bạn có thể đưa ra một ví dụ?
Tim Snowhite 10/09/10

1
Có lẽ, nhưng câu hỏi, câu trả lời, và bình luận được viết vào năm 2009.
JohnMcG

15

Đây là một toán tử bậc ba, về cơ bản nó là một câu lệnh if nội tuyến

x ? y : z

hoạt động như thế nào

if(x) y else z

ngoại trừ, thay vì các câu lệnh bạn có các biểu thức; vì vậy bạn có thể sử dụng nó ở giữa một câu lệnh phức tạp hơn.

Nó hữu ích để viết mã ngắn gọn, nhưng có thể bị lạm dụng để tạo mã khó bảo trì.


4
Bạn phải cẩn thận ở đây; nó không hoạt động chính xác như một câu lệnh if. Trong khi bạn có thể nói điều gì đó như int a = x ? y : z;mà bạn không thể nóiint a = if(x) y else z;
Daniel LeCheminant

4
đáng giá khi biết rằng có một điểm trình tự tại dấu '?'. Điều đó có nghĩa là giá trị sau: ++ x? x: y;
Johannes Schaub - litb

1
@Daniel, đó là ý của tôi khi có các biểu thức hơn là các câu lệnh. Tôi có thể không đủ rõ ràng về sự khác biệt, vì vậy cảm ơn đã thêm một số làm rõ.
Richard

6

Bạn chỉ có thể viết lại nó thành:

int qempty(){ return(f==r);}

Điều nào làm tương tự như đã nói trong các câu trả lời khác.


điều này sẽ thực hiện chuyển đổi ngầm từ boolean để int
Don Cheadle

6

Chỉ cần một ghi chú, nếu bạn thấy điều này:

a = x ? : y;

Đó là một tiện ích mở rộng GNU cho tiêu chuẩn (xem https://gcc.gnu.org/onlineocs/gcc/Conditionals.html#Conditionals ).

Nó giống như

a = x ? x : y;

trong CLang (ít nhất là các phiên bản gần đây nhất) tiện ích mở rộng này cũng có sẵn. Nó có sẵn ngay cả khi cờ C ++ 11 bị tắt trong một dự án qmake. Vì vậy, một biểu thức như int x = 1+1 ? : 0 ; trả về chính xác 2 , trong trình biên dịch của tôi và điều này không phàn nàn bất cứ điều gì.
Vinícius A. Jorge


3

Đó là toán tử điều kiện.

a? b: c

Đó là một phím tắt cho IF / THEN / ELSE.

nghĩa là: nếu a đúng thì trả về b, ngược lại thì trả về c. Trong trường hợp này, nếu f == r, trả về 1, ngược lại trả về 0.


2

Dấu chấm hỏi là toán tử điều kiện. Mã có nghĩa là nếu f == r thì trả về 1, ngược lại, trả về 0. Mã có thể được viết lại thành

int qempty()
{
  if(f==r)
    return 1;
  else
    return 0;
}

đây có lẽ không phải là cách sạch sẽ nhất để làm điều đó, nhưng hy vọng sẽ giúp ích cho sự hiểu biết của bạn.

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.