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
给出两个&&连接条件.我知道评估的顺序是从左到右.但是如果第一个条件解析为false,那么第二个条件保证不会被评估?
#define SIZE
bool array[SIZE];
int index;
// play with variables
// ...
if(index < SIZE && array[index])
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果第一个条件为false,则不能评估第二个条件,因为数组中的访问将超出范围.
顺便说一句,我不能简单地用两个if语句嵌套条件,因为实际上我需要反向像(!(in_range && get_element)).使用嵌套语句,我需要用goto它跳过下面的代码块.
c++ if-statement execution boolean-expression operator-precedence
考虑以下代码:
int a = 5;
if (a == 5 || a == 10)
doSomething();
Run Code Online (Sandbox Code Playgroud)
在这种情况下a是5所以第一个条件是真的.程序是否会检查第二个条件是否为真,或者在确定第二个条件确实为5 doSomething()后立即开始执行a?
假设我有两个函数和一个变量,
int number;
bool foo (void);
bool footoo (void);
Run Code Online (Sandbox Code Playgroud)
在每个函数中,number都会发生一些带变量的逻辑,例如:
number++;
return(rand()%2);
Run Code Online (Sandbox Code Playgroud)
然后我称他们为:
if (foo() && footoo())
{
cout << "Two foo true!"
}
Run Code Online (Sandbox Code Playgroud)
为什么不调用这两个函数number?无论返回值如何,我如何保证调用和递增函数?
我有以下结构定义和特定用例:
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) 我使用的书给出了从右到左的逻辑运算符的关联性,所以我希望这个代码的结果是,2 2 1但它是2 1 1.
int x,y,z;
x=y=z=1;
z=++x||++y||++z;
printf("%d %d %d",x,y,z);
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
这是代码:
void main()
{
clrscr();
int a=-3 , b=2 , c=0, d;
d = ++a && ++b || ++c;
printf("a=%d , b=%d , c=%d, d=%d ",a,b,c,d);
getch();
}
Run Code Online (Sandbox Code Playgroud)
输出: -2 , 3 , 0 , 1
我无法理解为什么价值c不会增加,我认为它应该是1如何产生的d = 1.