ANSI标准是否要求逻辑运算符在C或C++中被短路?
我很困惑,因为我记得K&R的书说你的代码不应该依赖于这些操作被短路,因为它们可能没有.有人可以指出标准中的哪个位置逻辑操作始终是短路的吗?我最感兴趣的是C++,C的答案也很棒.
我还记得读(不记得在哪里)评估顺序没有严格定义,所以你的代码不应该依赖或假设表达式中的函数将按特定的顺序执行:在语句的末尾所有引用的函数将被调用,但编译器可以自由选择最有效的顺序.
标准是否表明该表达式的评估顺序?
if( functionA() && functionB() && functionC() ) cout<<"Hello world";
Run Code Online (Sandbox Code Playgroud) c c++ operator-precedence short-circuiting logical-operators
假设我有两个表达式左/右的||运算符.我发现如果左表达式为真,则永远不会调用右运算符.例如,在我的下面的代码中,当getRand返回true时,我发现Foo永远不会被调用.我在Mac OSX上的XCode上进行了测试,并想知道它是否是我们可以依赖的C++的可靠特性 - 如果留下部分|| 是真的,右边的部分永远不会被调用,或者它只是特定平台的特殊功能(例如带有XCode的OSX)?在下面发布我的代码,谢谢.
bool Foo()
{
std::cout << "I am called!\n";
return false;
}
bool getRand()
{
int random_variable = std::rand();
std::cout << random_variable << '\n';
return random_variable % 2 == 1;
}
int main(int argc, const char * argv[]) {
if (getRand() || Foo())
{
std::cout<<"Hello World \n";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
林先生,提前谢谢
我已经阅读了之前的帖子并且我已经学到了一些东西,但是想要验证一些循环是如何工作的.在阅读中,我是否正确理解"真实"的优先级高于"虚假"?例如:
/.../
return (true || false);
Run Code Online (Sandbox Code Playgroud)
将返回"true"(无论顺序)?
如果我有一个布尔递归函数调用它自己的3个变量...我需要的是一个版本返回true以使整个函数返回true,对吗?下面的函数创建它的堆栈帧,然后返回调用创建3个堆栈帧并运行调用,然后如果一个返回true,整个funct返回true,因为true优先于false ...这个假设是否正确?
即:
/* This function is taking a given weight and seeing if it can be offset by available
* weights. Depending on what weights are available, the weights can be directly opposed
* to "weight" (opposite side of scale) or added to... The recursive calls will either all
* return false, all return true, or a variation thereof. All that I can is that if one
* branch returns true, the …Run Code Online (Sandbox Code Playgroud) 在研究iOS问题时,我发现了以下答案:如何判断UIViewController的视图是否可见
答案的细节并不重要,但重要的是它基本上说如果你有一个看似如下的条件语句......
if(X && Y)
{
//do stuff here
}
Run Code Online (Sandbox Code Playgroud)
如果X为假,则永远不会评估Y. 这是真的?是否可以肯定编译器不会优化它if(Y && X)?
我有以下结构定义和特定用例:
struct foo
{
bool boo;
};
int main()
{
foo* f = 0;
.
.
.
if ((f) && (f->boo)) // <--- point of contention
return 0
else
return 1;
}
Run Code Online (Sandbox Code Playgroud)
标准是否保证上面if语句中的第一组括号始终在第二个之前进行评估?
如果没有什么是最好的重写上面的代码?
目前我有以下一塌糊涂:
if (f)
{
if (f->boo)
return 0;
else
return 1;
}
else
return 1;
Run Code Online (Sandbox Code Playgroud) main()
{
int k = 5;
if(++k <5 && k++/5 || ++k<=8); // how to compiler compile this statement
print f("%d",k);
}
Run Code Online (Sandbox Code Playgroud)
//这里的答案是7但是为什么?