C++ 为什么我能';不能将声明和逻辑运算符放在一起吗?

C++ 为什么我能';不能将声明和逻辑运算符放在一起吗?,c++,C++,出于效率原因(尽管非常小),我想在if条件块中声明并分配一个变量 也就是说,不要说 if(a != 0 && a->b >= 10){ int c = a->b ... } 我想首先分配int c,然后说 if(a != 0 && (int c = a->b) >= 10){ ... } 以最直接的方式(对我来说),我得到了编译错误。有人知道在C++中是否有可能做到这一点? < p>为什么你认为这会优化任何

出于效率原因(尽管非常小),我想在if条件块中声明并分配一个变量

也就是说,不要说

if(a != 0 && a->b >= 10){
    int c = a->b
    ...
}
我想首先分配int c,然后说

if(a != 0 && (int c = a->b) >= 10){
    ...
}

以最直接的方式(对我来说),我得到了编译错误。有人知道在C++中是否有可能做到这一点?

< p>为什么你认为这会优化任何东西?

假设你可以在一个条件下声明和初始化一个变量(在C++中是不可能的,因为编译器想要一些可以被评估的东西,而一个声明不返回任何东西),这将在每次条件被评估时完成(除非你短路,这是你的片段中的情况)但无论如何都不会改变:无论在哪里,您仍然在声明和初始化变量。

如果您在第一个条件下使用它,它将起作用。然而,在这种情况下,比较在赋值之前,您将无法得到您想要的结果

if(a != 0) {
    int c = a->b;

    if (c >= 10) {
        //using c here
    }

    // common cleanup here
}
int a = 3;
int x = 0;
if ( bool b = a > 5 && x < 2) {
printf("%d",b);
}
inta=3;
int x=0;
如果(布尔b=a>5&&x<2){
printf(“%d”,b);
}

如果要避免多次使用
a->b

“过早优化是万恶之源”-Donald Knuth.我很困惑。。你用“代码> A> > >代码>和<代码> A/<代码>访问哪一个?你不能做C++编译器期望布尔语句的赋值。问题的关键是,当条件为真时,<代码> > -> b>代码>立即被重新评估。如果
a->b
是一个昂贵的操作,那么只对它进行一次评估可能是有意义的。我仍然看不到优化的任何意义:在
If
之前将
a->b
分配给一个临时变量,然后使用它以防万一,成本与他希望使用的优化一样高。@GSerg:ok,在这种情况下,您将有两个嵌套的
if
s,第一个嵌套的
int c=a->b
。一个提示:声明不会返回任何内容,但这是完全有效的:
if(int x=foo()){/*使用x*/}
。就我个人而言,我不喜欢OP的语法,但我不明白为什么一个应该有效,另一个应该无效。感谢moswald,对了,当您向语句中添加布尔求值时,它不起作用。i、 如果你说如果((int x=foo())>10,这就行不通了好吧,顺序对我来说很重要,因为我首先要检查对象是否存在,以便调用它的函数,这正是我通过的过程,我想跳过嵌套的IF cases,因为我需要在两种情况下重复一段代码,这并不漂亮。@nino你能不能将这段代码移到内部
IF
,以便它总是在外部
IF
中执行?我不这么认为,因为如果inner if成立,那段代码就不会被调用。感谢Patrik的建议,这个想法是可行的,但是它的缺点是定义变量c的范围比需要的范围大。
int c = (a == 0 ? 0 : a->b);
if(a != 0 && c >= 10){

    ...
}