if
在看到一些发布的解决方案之前,我不知道如何创建一个变量并用 an 测试它的值。但是,您可以使用switch
. 这将允许您对附加值做出反应(也许EOF
):
switch (int c = getc(stdin)) {
case 0x01: ungetc(c, stdin); break;
case EOF: // ...handle EOF
default: break;
}
您总是可以将if
语句放在内联函数中,这样代码看起来会更简洁一些。如果你真的想要源代码在那个位置,但是没有在一个新的变量周围创建一个新的范围if
,那么你可能会接受一个 lambda。
[](int c){ if (c == 0x01) ungetc(c, stdin); }(getc(stdin));
由于您只与一个值进行比较,因此您的特定问题根本不需要变量,因此您可以简单地执行以下操作:
if (getc(stdin) == 0x01) {
char c = 0x01;
ungetc(c, stdin); //or bla...
}
如果您想与一组值进行比较,那么switch
建议是更好的选择。
Jerry Coffin 的解决方案看起来很吸引人,但实际上归结为:
if (int c = (getc(stdin) == 0x01)) //...
这可能不是您真正想要的,因为如果您想与不同于0x01
.
Potatoswatter 的解决方案似乎更接近您想要的,但也许将类型拉到一个独立的类中会更好:
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...
}