C-警告:建议围绕用作真实价值的分配



我有这个代码,我不明白

当我编译以下代码时:

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

int main() {
double x=1;
double y=0;
  if (x!=y)
  {
    printf("x!=yn");
  }
  if (x=y)
  {
  printf("x=yn");
  }
  return 0;
}

我得到以下警告:警告:建议用作真实价值的分配括号

运行程序时,我将获得以下输出

x!=y
x=y

为什么要打印x = y如果如果不是'=',而是要放置x中的y中的值。

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

关于问题:由于x = y评估y(A double)和y为零,因此结果为false,因为这是C标准所说的应该发生的。从6.3.1.2:

当任何标量值转换为_bool时,结果是0 值比较等于0;否则,结果为1。

因此,运行此代码应该不是打印"等价"消息,就像我对我一样。

if (x!=y)           // This tests if x is not the same value as y
{
  printf("x!=yn"); // 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=yn");  // if y was not 0, then print this
}

我认为您想要:

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

为您的第二次检查

编辑
阅读您的评论后,我发现您正在获得两个印刷品...我不确定您正在使用的编译器,但我无法复制您的结果。您确定代码已正确复制吗?当我运行时,我只按照我的解释来获得x!=y

使用GCC运行您的代码,您会正确看到...我能想到的只是您使用一些怪异的非C标准编译器运行,并且在分配Y。

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

编辑:两行都是由于作业而打印的:

  • x!=y评估为true-因此,第一行被打印。
  • x=y是一个任务,从本质上说x应采用y的值,在这种情况下为0

因此,第二行不应写(作为0评估为false),但总的来说,我要说这是一个错误或某些精度错误(这在0的简单分配中不应该发生但是你永远不会知道)。

这可能是您正在制作错别字。

通常,您将有:

if(condition)

在您的情况下,条件是一个分配,因此,如果总是评估为真实,则是编译器的建议。

丹尼尔·菲舍尔(Daniel Fischer)回答了您的问题。您正在测试以查看x = y。不是,所以您的第一个测试是正确的。然后,您将y分配给x,它在工作时返回true并导致输出第二个打印语句。

平等操作为 ===是分配操作员

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

因为在这种情况下,如果第一次评估x=y,它将分配一个从yx的值,然后将表达式视为if(x),然后将其评估。

现在在这里,如果x具有0,则if(x)将视为false,否则为true。

因此,x=y不会以输出为输出。

最新更新