Tôi không biết làm thế nào để tạo ra một biến và kiểm tra giá trị của nó với một if
cho đến khi sau khi nhìn thấy một số posted các giải pháp. Tuy nhiên, bạn có thể sử dụng switch
. Điều này sẽ cho phép bạn phản ứng với những giá trị bổ sung (có lẽ EOF
):
switch (int c = getc(stdin)) {
case 0x01: ungetc(c, stdin); break;
case EOF: // ...handle EOF
default: break;
}
Bạn luôn có thể đặt câu lệnh if
trong một chức năng inlined thay vào đó, và mã sẽ xem xét một chút bụi. Nếu bạn thực sự muốn mã nguồn ngay tại vị trí đó, nhưng không tạo phạm vi mới xung quanh một if
với biến mới, thì có lẽ một lambda sẽ được chấp nhận cho bạn.
[](int c){ if (c == 0x01) ungetc(c, stdin); }(getc(stdin));
Vì bạn chỉ so sánh với một VALUEm vấn đề cụ thể của bạn không đòi hỏi một biến ở tất cả, vì vậy bạn chỉ có thể làm:
if (getc(stdin) == 0x01) {
char c = 0x01;
ungetc(c, stdin); //or bla...
}
Nếu bạn đang muốn so sánh với một tập hợp các giá trị , sau đó đề xuất switch
là tùy chọn tốt hơn.
giải pháp
Jerry Coffin trông hấp dẫn, nhưng nó thực sự nắm tới:
if (int c = (getc(stdin) == 0x01)) //...
Đây có lẽ không phải những gì bạn thực sự muốn, vì nó không khái quát tốt nếu bạn muốn so sánh với một giá trị khác nhau từ 0x01
.
giải pháp Potatoswatter dường như gần gũi hơn với những gì bạn muốn, nhưng có lẽ nó sẽ đẹp hơn để kéo các loại ra vào một lớp độc lập:
template <typename T>
class SetAndTest {
const T test_;
T set_;
public:
SetAndTest (T s = T(), T t = T()) : set_(s), test_(t) {}
operator bool() { return set_ == test_; }
operator bool() const { return set_ == test_; }
operator T &() { return set_; }
operator T() const { return set_; }
};
//...
if (auto c = SetAndTest<int>(getc(stdin), 0x01)) {
ungetc(c, stdin); //or bla...
}
Bạn có thể lạm dụng vòng lặp 'for'. – SLaks
Nếu đó là về ô nhiễm, bạn luôn có thể sử dụng phạm vi mới hoặc vòng lặp for. – chris
Giải pháp gọn gàng nhất (ngu ngốc) có lẽ là 'if (int c = getc (stdin) - 1); khác ungetc (c + 1); '. – Potatoswatter