Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解释以下输出?_C++_Operator Precedence - Fatal编程技术网

C++ 解释以下输出?

C++ 解释以下输出?,c++,operator-precedence,C++,Operator Precedence,请解释输出: #include<iostream.h> int main() { int i= -3, j=2, k=0, m; m = ++i || ++j && ++k; cout<< i <<" " << j << " " << k <<" "<<m; return 0; } #包括 int main() { int i=-3,j=2,k=0,m

请解释输出:

#include<iostream.h>
int main()
{
    int i= -3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}
#包括
int main()
{
int i=-3,j=2,k=0,m;
m=++i | |++j&&++k;

逻辑表达式中的CUT< P>,如:<代码>………& &…./>代码> C++,可以省略不改变表达式输出值的语句。例如:如果计算第一个值,其输出不等于0,那么表达式:<代码> true >…& &…/COD>总是正确的,因此进一步表达式的执行不是必要的

让我们从这个代码片段开始

#include<iostream.h>
int main()
{
    int i= -3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}
#include<iostream.h>
int main()
{
    int i= -1, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}
m
等于1,
i
等于-2所有其他变量均未更改

在这个代码片段中

#include<iostream.h>
int main()
{
    int i= -3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}
#include<iostream.h>
int main()
{
    int i= -1, j=2, k=0, m;
    m = ++i || ++j && ++k;
    cout<< i <<" " << j << " " << k <<" "<<m;
    return 0;
}
由于
++j
将等于3且不等于0,则
++k
也将被计算并将等于1。由于
运算符和&
的两个操作数均不等于零,则结果等于
true

因此,您将得到i==0,j==3,k==1,m==1

<>从C++标准

5.14逻辑与运算符

1&&运算符从左到右分组。操作数都是 上下文转换为bool(第4条)。如果两者都 否则操作数为true和false。与&,&&不同 从左到右求值:如果 第一个操作数为false。

5.15逻辑或运算符

1 | |运算符从左向右分组。操作数都是 上下文转换为bool(第4条)。如果 其操作数的值为true,否则为false。与|,|| 保证从左向右求值;此外,第二个操作数是 如果第一个操作数的计算结果为true,则不进行计算。


以下是您的第二个案例:-

int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;

若cond1为true,则编译器不会继续检查cond2。只有当cond1返回false时,它才会计算cond2


所以,在second++中,我将第一个表达式设为false,并强制编译器进一步求值,而在第一种情况下,第一个表达式返回true。

您不明白什么?您期望什么?请记住,逻辑运算符使用了。如果有疑问,请使用括号。依靠运算符的精确性是很好的,但这一切都需要es是一个错误。在这种情况下,我更喜欢明确地定义执行的“顺序”(通过
()
)你是如何把括号放进去的?(++I++j&&&&&(++k)或(++I)|(++j&&++k)@lazygeek表达式m=++I |++j&&++k;相当于m=++I |(++j&++k));哦,是的。我现在明白了。我仍然想知道为什么这个问题我得到了-6。@lazygeek现在是-5。:)我还想知道,当初学者的问题含义明确时,什么时候会被否决。这不是第一次。这是我的第三个或第四个问题。很抱歉,有些人有点粗鲁,尤其是对初学者。
int i= -1, j=2, k=0, m;
m = ++i || ++j && ++k;
( cond1 || cond2)