Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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++的多项选择题。 我无法理解以下代码的输出:: #include <iostream> using namespace std; int main() { int x,y,z; x=y=z=1; z=++x || ++y && ++z; cout<<x<<" "<<y<<" "<<z<<endl; system("pause"); return 0; }_C++ - Fatal编程技术网

优先规则 我正在解决C++的多项选择题。 我无法理解以下代码的输出:: #include <iostream> using namespace std; int main() { int x,y,z; x=y=z=1; z=++x || ++y && ++z; cout<<x<<" "<<y<<" "<<z<<endl; system("pause"); return 0; }

优先规则 我正在解决C++的多项选择题。 我无法理解以下代码的输出:: #include <iostream> using namespace std; int main() { int x,y,z; x=y=z=1; z=++x || ++y && ++z; cout<<x<<" "<<y<<" "<<z<<endl; system("pause"); return 0; },c++,C++,此外,一元++的关联性是“从右到左” . 所以 因此,根据我的说法,正确的输出应该是x=2,y=2和z=1 但是当我在编译器中运行这段代码时,编译器的输出是x=2,y=1,z=1 为什么我会得到这样的输出,我在哪里犯了错误 谢谢 和&&和|操作员短路。它们计算左侧,然后仅在需要确定值时计算右侧 因此,如果|的左侧为true,则不计算右侧;如果&&的左侧为false,则不计算右侧 在您的示例中,由于++x为true(2),因此不会计算|的右侧。运算符优先级告诉您如何对表达式进行分组;它不会告诉你它

此外,一元++的关联性是“从右到左” . 所以

因此,根据我的说法,正确的输出应该是x=2,y=2和z=1

但是当我在编译器中运行这段代码时,编译器的输出是x=2,y=1,z=1

为什么我会得到这样的输出,我在哪里犯了错误


谢谢

&&
|
操作员短路。它们计算左侧,然后仅在需要确定值时计算右侧

因此,如果
|
的左侧为true,则不计算右侧;如果
&&
的左侧为false,则不计算右侧


在您的示例中,由于
++x
为true(
2
),因此不会计算
|
的右侧。

运算符优先级告诉您如何对表达式进行分组;它不会告诉你它们的执行顺序

|
&
的特殊之处在于,第一个操作数始终首先求值,第二个操作数(包括所有子表达式)仅在需要确定表达式的值时才求值

对于
| |
,如果第一个操作数的计算结果为
true
,则不计算第二个操作数,因为逻辑or的结果始终为true

类似地,如果第一个操作数作为逻辑值计算为false,则不会计算
&&
的第二个操作数,并且在这种情况下必须为false

在表达式
z=++x | |++y&&++z
中,语法规则指定了一个分组:

z = ((++x) || ((++y) && (++z)));

在子表达式
(++x)|((++y)和(++z))
中,当
(++x)
计算结果为
真时(当2为非零时),第二个操作符
(++y)和(++z))
永远不会计算
x
变为2,
y
不变,
z
被赋值
1
true
转换为整数)。

逻辑OR运算符要求如果两个操作数中的任何一个非零,则条件变为true。在表达式
A | | B
中,
A
B
为非零,则
(A | | B)
将为true或等于
1

因此,编译器将忽略
++y
++z
,因为
++x
的值是
1
请记住,编译器仅在需要时才执行整个逻辑表达式。否则,它会试图尽可能少地完成工作


例如,如果使用&&运算符,则必须对这两个表达式求值。但是,如果使用| |运算符(已使用),如果左侧的第一个表达式为true,则不会执行右侧的表达式。在您的示例中,++x给出2,该值被计算为布尔真值。编译器的故事结束了,因为一旦为true,OR语句将永远不会恢复为FALSE。这个概念被编译器称为“短路”。这就是为什么您得到了所描述的输出。

Charles Bailey非常感谢。。因此,基本上,运算符优先级首先对表达式进行分组。计算总是从左到右进行的,不是吗?@ritesh\u nitw:一般来说,表达式的求值不一定是从左到右进行的,但对于
|
&&&
来说,这是保证的,其中左操作数总是先求值的。表达式的可能重复
z=(++x)||(++y) && (2)
z=(++x)||(2)&& (2)
z=(2)||(2)&&(2)
z=(2)|| 1  //As 2 && 2 is 1(true)
z=1       // As 2 || 1 is 1(true)
z = ((++x) || ((++y) && (++z)));