我想在if语句的括号中声明一个局部变量.例如.
if((char c = getc(stdin)) == 0x01)//This is not OK with g++.
{
ungetc(c, stdin);
}
Run Code Online (Sandbox Code Playgroud)
我想要的是,看看角色是否是我想要的角色.常用说了吧,我想用变量(焦三)双方在行,如果和身体如果,但是没有外界如果.
但是g ++(GCC 4.8.1)说'char'之前的预期主表达式.我想知道是否有办法做到这一点,因为我不想要类似的东西
char c = getc(stdin);
if(c == 0x01)
{
bla...
}
Run Code Online (Sandbox Code Playgroud)
Sho*_*hoe 17
如果是你担心的命名空间污染,你总是可以if在一个块中定义语句:
{
char c = getc(stdin);
if(c == 0x01)
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
所以这c只会持续到达块结束.
jxh*_*jxh 10
if在看到一些已发布的解决方案后,我不知道如何创建变量并测试其值.但是,你可以使用switch.这将允许您对其他值(可能EOF)做出反应:
switch (int c = getc(stdin)) {
case 0x01: ungetc(c, stdin); break;
case EOF: // ...handle EOF
default: break;
}
Run Code Online (Sandbox Code Playgroud)
您可以始终将if语句放在内联函数中,代码看起来会更清晰一些.如果你真的想在那个位置找到源代码,但是没有if用新变量创建一个新的范围,那么你可能会接受一个lambda.
[](int c){ if (c == 0x01) ungetc(c, stdin); }(getc(stdin));
Run Code Online (Sandbox Code Playgroud)
由于您只是与一个值进行比较,因此您的特定问题根本不需要变量,因此您可以简单地执行以下操作:
if (getc(stdin) == 0x01) {
char c = 0x01;
ungetc(c, stdin); //or bla...
}
Run Code Online (Sandbox Code Playgroud)
如果您想要与一组值进行比较,那么switch建议是更好的选择.
Jerry Coffin的解决方案看起来很吸引人,但它真的归结为:
if (int c = (getc(stdin) == 0x01)) //...
Run Code Online (Sandbox Code Playgroud)
这可能不是你真正想要的,因为如果你想比较一个不同的值,它就不能很好地概括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...
}
Run Code Online (Sandbox Code Playgroud)
你可以在if语句中定义变量就好了.例如,这应该编译:
if (int ch = getchar())
;
Run Code Online (Sandbox Code Playgroud)
问题是类型(例如int)必须在左括号后立即跟随.您拥有的额外括号是导致编译失败的原因.所以,如果你真的想这样做,你需要有点聪明并使用这样的东西:
if (char ch = 0 || ((ch = getchar()) == 0x1))
Run Code Online (Sandbox Code Playgroud)
这使您可以ch完成done 的创建和初始化,然后在表达式的该部分完成之后,在括号周围放置ch=getchar()以覆盖赋值与比较的优先级.
请注意&&并||进行短路评估,因此您需要小心初始化.你可以使用:
if (char ch = 0 || ...
Run Code Online (Sandbox Code Playgroud)
...要么:
if (char ch = 1 && ...
Run Code Online (Sandbox Code Playgroud)
...但是如果您尝试使用if (ch = 1 || ...或if (ch = 0 && ...,则短路评估将保持正确的操作数(您真正关心的部分)的评估.
现在需要注意的是:虽然我有理由相信这段代码符合标准的要求,并且大多数(所有?)当前的编译器都会接受它,这可能会导致大多数程序员阅读代码时会有一些严重的问题,弄清楚你做了什么,为什么.关于在实际代码中使用这种"技术",我会非常犹豫(充其量).
编辑:有人指出,由此产生的结果可能比最初预期的更具误导性,因此我将尝试澄清情况.会发生什么是从输入读取值.该值被分配ch并与之比较0x1.到现在为止还挺好.之后,将分配比较结果(转换为整数,因此0或者1)ch.我相信它有足够的序列点,结果是定义的行为.但它可能不是你或任何人想要的东西 - 因此建议你可能不想使用它,并提到它可能会让大多数程序员摸不着头脑,想知道你想要做什么.在与0x1进行比较的非常具体的情况下,的值ch内部的if声明将是1,但它或多或少是巧合.如果你要比较0x2,那ch里面的值if仍然是1,而不是2.