-6

我有这段代码,但有一些我不明白的地方

当我编译以下代码时:

#include <stdio.h>
#include <stdlib.h>


int main() {

double x=1;
double y=0;

  if (x!=y)
  {
    printf("x!=y\n");
  }
  if (x=y)
  {
  printf("x=y\n");
  }

  return 0;
}

我收到以下警告:警告:建议在分配周围使用括号作为真值

当我运行程序时,我得到以下输出

x!=y
x=y

如果'='不是为了比较而只是将y中的值放入x中,为什么要打印x = y。

4

6 回答 6

8

编译器警告您表达式的结果x = y在条件中使用;我提到这一点,即使它似乎与您的实际问题无关,因为这些天,通常这意味着有一个错字,而作者打算改写==

关于这个问题:由于x = y评估为y(a double) 并且y为零,因此结果是false因为这就是 C 标准所说的应该发生的事情。从 6.3.1.2 开始:

当任何标量值转换为 _Bool 时,如果该值比较等于 0,则结​​果为 0;否则,结果为 1。

因此,运行此代码不应打印“等于”消息,就像它对我一样

于 2012-10-31T14:40:18.880 回答
1

您使用了错误的运算符:=是赋值,==是真正的比较(相等)。编译器会检测到这一点并警告您,以防万一这可能不是故意的(您更有可能进行比较而不是赋值)。这是完全有效的 C(因此它只是一个警告,没有错误)。只是为了确保它是故意的,它要求您在周围添加括号:if ((x=y))。这不会在代码方面造成任何差异,但它表明返回值是单独使用的,而赋值只是其中的一部分(难以描述)。

编辑:由于分配,两行都被打印:

  • x!=y计算结果为 true - 因此打印第一行。
  • x=y is an assignment, which is essentially saying that x should take the value of y, which is 0 in this case.

As such the second line shouldn't be written (as 0 evaluates to false), but in general, I'd say it's either a bug or some precision error (this shouldn't happen with a simple assignment of 0, but you never know).

于 2012-10-31T14:36:53.973 回答
1
if (x!=y)           // This tests if x is not the same value as y
{
  printf("x!=y\n"); // if x is not the same value as y print this
}

if (x=y)            // This assigns x the value of y, the tests the new value of x
{
  printf("x=y\n");  // if y was not 0, then print this
}

我想你想要:

if (x == y) // if x is the same value as y

第二次检查

编辑
阅读您的评论后,我看到您得到了两个打印件......我不确定您使用的是什么编译器,但我无法重现您的结果。你确定代码被正确复制了吗?当我跑步时,我只会x!=y按照我的解释得到预期的结果。

用 gcc 运行你的代码,你会正确地看到它......我所能想到的就是你正在使用一些奇怪的非 C 标准编译器运行,它在分配 y 之前检查 x 的值。

于 2012-10-31T14:37:50.917 回答
0

相等运算 is===is 赋值运算符

正确的形式是if(x == y),但它也会运行它if(x=y)

因为在这种情况下, if 将首先评估 ,然后它会从to和之后x=y分配一个值,表达式将被视为, 然后它会评估。yxif(x)

现在这里如果x0,那么if(x)将视为假,否则为真。

因此,x=y不会将打印作为输出。

于 2012-10-31T14:37:31.883 回答
0

这是一个建议,也许你正在打错字。

通常,您将拥有:

if(condition)

在您的情况下,条件是一个赋值,因此 if 总是评估为 true 因此编译器的建议。

于 2012-10-31T14:37:36.823 回答
0

Daniel Fischer 已回答您的问题。您正在测试是否 x=y。它没有,所以你的第一个测试是真的。然后将 y 分配给 x,它在工作时返回 true,并导致输出第二个 print 语句。

于 2012-10-31T14:38:36.540 回答