retval=false&&;someFunction();//是否调用someFunction()? 我目前正在使用DIABC 4.4 C++编译器。这是一个完全的POS,不符合ANSI标准,我在过去发现了它的问题

retval=false&&;someFunction();//是否调用someFunction()? 我目前正在使用DIABC 4.4 C++编译器。这是一个完全的POS,不符合ANSI标准,我在过去发现了它的问题,c++,C++,我想知道下面的问题是编译器的问题,还是我对C语言知识的不足++ 我意识到x=x&&y;如果x为假,将使y部分短路。在x=x&&y()的情况下,编译器所做的是短路;其中y()是一个非常量函数 class A { int _a; A(int a) { _a = a; } bool someFunction() { _a = 0; return true; } }; main(...) { A obj = A(1); bool retval = false; retval = retval &a

我想知道下面的问题是编译器的问题,还是我对C语言知识的不足++

我意识到x=x&&y;如果x为假,将使y部分短路。在x=x&&y()的情况下,编译器所做的是短路;其中y()是一个非常量函数

class A
{
int _a;
A(int a) { _a = a; }
bool someFunction() { _a = 0; return true; } 
};

main(...)
{
A obj = A(1);
bool retval = false;

retval = retval && A.someFunction();

/* What is the value of A._a here? */
}
在我看来,错误在于编译器正在进行这种短路,即使someFunction()不是常量函数。如果它不是const,那么当retval为false时,编译器是否跳过了.someFunction(),从而超出了它的界限


此外,我意识到通过编写retval=A.someFunction()&&retval;但我真的很想知道为什么会发生这种情况。

短路适用于所有表达式,而不管
常数如何。跳过对
someFunction()
的调用是正确的。

短路适用于所有表达式,无论
常数如何。跳过对
someFunction()
的调用是正确的。

&&
的第二个操作数是否为常量并不重要。第一个操作数计算为
false
后,返回值已知,因此没有理由计算第二个操作数


如果函数有需要执行的副作用,请将其放在第一位。

&&
的第二个操作数是否为常量并不重要。第一个操作数计算为
false
后,返回值已知,因此没有理由计算第二个操作数


如果函数有需要执行的副作用,请将其放在第一位。

定义了
&&&
|
运算符以惰性方式进行计算,这就是语言的工作方式。如果希望副作用总是发生,请首先调用函数并隐藏结果,或者重构函数以将工作从状态查询中分离。

定义了
&&
|
运算符以进行惰性计算,这就是语言的工作方式。如果希望副作用总是发生,请先调用函数并隐藏结果,或者重构函数以将工作从状态查询中分离。

短路计算与常量或非常量无关。不管发生什么,它都会发生


语句
A()&&B()将完全执行
的操作
可以(尽管它不是一个完美的替代品,因为第二个允许使用
else
)。这有时用于将语句更改为表达式(例如在编写宏或将其嵌入另一个语句时)。

短路计算与常量或非常量无关。不管发生什么,它都会发生


语句
A()&&B()将完全执行
的操作
可以(尽管它不是一个完美的替代品,因为第二个允许使用
else
)。这有时用于将语句更改为表达式(例如在编写宏或将其嵌入另一个语句时)。

该&&运算符也称为快捷运算符,这意味着仅当第一部分返回true时,它才计算第二部分。这就是&&和&:

value = func1() && func2(); // evaluates func2() only if func1() returns true

value = func1() & func2(); // evaluates both func1() and func2()

&&运算符也称为快捷方式运算符,这意味着它仅在第一部分返回true时计算第二部分。这就是&&和&:

value = func1() && func2(); // evaluates func2() only if func1() returns true

value = func1() & func2(); // evaluates both func1() and func2()
对于&&运算符

1 && X = X
0 && X = 0
所以在第一个变量为0的情况下,编译器将把表达式求值为0,毫无疑问,X是什么

编译器将忽略X部分,因为它不会影响结果。这里X可以是任何东西函数/变量/表达式

对于&&运算符

1 && X = X
0 && X = 0
所以在第一个变量为0的情况下,编译器将把表达式求值为0,毫无疑问,X是什么


编译器将忽略X部分,因为它不会影响结果。这里X可以是任何东西函数/变量/表达式

正如其他人所解释的,| |和&&始终执行短路评估

还要注意,短路评估非常有用,因为它可以让您编写如下代码:

retval = obj_pointer && obj_pointer->SomeBooleanMethod();

如果没有短路评估,这将在空指针上崩溃。

正如其他人所解释的,| |和&&始终执行短路评估

还要注意,短路评估非常有用,因为它可以让您编写如下代码:

retval = obj_pointer && obj_pointer->SomeBooleanMethod();

如果没有短路求值,这将在空指针上崩溃。

没有意识到求值是懒惰的。现在更有意义了……或者如果两个操作数都是/返回布尔值,则使用(&E)。没有意识到计算是懒惰的。现在更有意义了……或者如果两个操作数都是/返回布尔值,则使用&实际上,
&&
&
与短路行为有很大不同
((0x10&0x01)==1)
((0x10&0x01)==0)
。实际上,
&
&
的区别远远不止于短路行为
((0x10&0x01)==1)
((0x10&0x01)==0)
。请注意,只有&&form是右值。你不能说:C=if(A())B();是的,它更接近C=A()?():()(除)()(0),1,C和For或C++中的真或假。它不会返回任何一个操作数,除非它们的值恰好为0或1或false或true。请注意,只有&&形式是右值。你不能说:C=if(A())B();是的,它更接近C=A()?():()(除)()(0),1,C和For或C++中的真或假。它不返回任何一个操作数,除非它们的值恰好为0或1或false或true。这并不能说明全部情况。当然,如果左边的pa