c 在这两种情况下如何工作以及有啥区别

Posted

技术标签:

【中文标题】c 在这两种情况下如何工作以及有啥区别【英文标题】:how c work in this two cases and what diffc 在这两种情况下如何工作以及有什么区别 【发布时间】:2015-02-12 09:08:16 【问题描述】:

为什么结果是 x=1 y=3 res=1

    int x = 7, y = 3;
    int res;
    res = (x = y < 2 ||  x != 1);
    printf("x = %d    y = %d    res = %d\n", x, y, res);

使用这段代码,结果是 y

    res= (x = y < 2);  //||  x != 1);
    printf("x = %d    y = %d    res= %d\n", x, y, res);

【问题讨论】:

请向我们说明并澄清您的问题。我们无法推断您在问什么。 第一个代码是如何工作的?为什么 x 是 1 而 res 是 1 ||是一个逻辑或运算符,这意味着 res 只有在其中的两个语句都返回 false 时才等于 false。 y ! 【参考方案1】:
res = (x = y < 2 ||  x != 1);

...被评估为...

res = (x = ((y < 2) || (x != 1)));

您可以找到 C++ 的运算符优先级here - C 与您使用的运算符类似。

所以对于x = 7, y = 3...

res = (x = ((3 < 2) || (7 != 1)));

res = (x = (false || true));  // || is "logical-OR", tests if either true

res = (x = true);

res = (x = 1);   // standard conversion from bool to int

res = 1;

第二个更简单的陈述:

 res = (x = y < 2);
 res = (x = (y < 2));
 res = (x = (3 < 2));
 res = (x = false);
 res = (x = 0);  // standard conversion from bool false to int 0
 res = 0;

在 C 中,即使你 #include &lt;stdbool.h&gt; &lt;!=|| 运算符将立即产生 1 用于“真”测试,0 用于“假”,并且没有单独的C++ 中的“标准转换”。 Allan 的回答很好地描述了 C 评估步骤。

【讨论】:

这个怎么样: res = ( x != 2 || x = y @aseed Ah yes... 对于res = ( x != 2 || x = y &lt; 2 );,运算符优先级规则意味着语句被解析为res = (((x != 2) || x) = (y &lt; 2)) - 你实际上是在要求编译器为((x != 2) || x) 赋值,就好像它是一个变量,但它是一个仅在表达式求值期间存在的 truefalse 临时值;因此编译器错误。【参考方案2】:
 res = (x = y < 2 ||  x != 1);

在上面的语句中y &lt; 2 || x != 1是一个条件表达式,其结果是true (1),它被加载到x中。

现在,(x = y &lt; 2 || x != 1) 被评估为x = 1,因此res = x = 1

你得到resx等于1y不变。

【讨论】:

这个怎么样: res = ( x != 2 || x = y 【参考方案3】:

您似乎遇到的问题是operator precedence。该链接指向一个运算符优先级图表,它应该有助于理清问题。

首先你应该知道比较结果要么是 1,要么是 0。例如,(5 10) 返回 0,因为它为假。

在您的示例中,如果我们通过添加括号来显示事情发生的顺序来澄清它会更容易。

res = (x = **(y < 2)** ||  **(x != 1)**)

这是发生的第一组操作。在这些解决之后,我们剩下:

res = (x = **(0)** ||  **(1)**)

接下来要进行的操作是 OR:

res = (x = **(0 || 1)** )

这导致 1:

res = (x = **1** )

然后赋值操作发生:

res = (**x = 1**)

然后下一个分配发生:

 **res = x**

由于之前赋值的 x 等于 1,因此 res 也设置为 1。

不知道你在第二点问什么,所以如果你想澄清,我会为你回答。

【讨论】:

【参考方案4】:

&lt; 的优先级高于=,因此x = y &lt; 2 等价于x = (y &lt; 2)

由于y 大于2,因此y &lt; 2 将给出0,并且此值将分配给x。现在x 等于0,因此x != 1 将被评估为true,整个表达式x = y &lt; 2 || x != 的值将是1,并且这个值被分配给res

【讨论】:

【参考方案5】:

在这种情况下,运算符优先级将起作用。

res = (x = y < 2 ||  x != 1);

在这个表达式中,首先计算 y

然后 or(||) 将起作用,因为第一个条件失败,所以现在 x 不等于 1。所以条件将变为真,所以真值1 存储在 x 和 res 变量中。

(y < 2 || x != 1 ). // expression is true. So the value 1 is stored in the variable x and ret.

第二种情况,

y < 2; // this condition will become false. So the zero is stored in both the variable.

【讨论】:

“所以 x 的值为零。然后 or(||) 将起作用” - 我想你会发现 || 运算符在 之前分配给x....

以上是关于c 在这两种情况下如何工作以及有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

arm为啥要分两种工作状态:arm和thumb

这两种寻址方式有啥区别[关闭]

$(var) 和 var 有啥区别?

C ++类构造函数设置变量这两种方式有啥区别?

Promises 和 Observables 有啥区别?

C ++中这两种强制转换方法有啥区别? [复制]