警告:建议用作真值的赋值周围的括号

时间:2012-10-31 14:33:59

标签: c if-statement compiler-warnings

我有这个代码,有些东西我不明白

编译以下代码时:

#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

为什么打印x = y,如果&#39; =&#39;不是要比较,而只是将y中的值放在x中。

6 个答案:

答案 0 :(得分:8)

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

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

  

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

因此,运行此代码应该打印“等于”消息,确实如此it does for me

答案 1 :(得分:1)

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

编辑: 由于赋值,两行都打印出来:

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

因此不应该写第二行(因为0的计算结果为false),但总的来说,我会说这是一个错误或一些精确错误(这不应该发生在一个简单的分配0,但你永远不知道。)

答案 2 :(得分: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的值。

答案 3 :(得分:0)

相等操作为===为赋值运算符

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

因为在这种情况下,如果首先评估x=y,它会将y的值分配给x,然后将表达式视为if(x)然后它会评估。

现在如果x0,那么if(x)会视为错误,否则为真。

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

答案 4 :(得分:0)

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

通常,您将拥有:

if(condition)

在你的情况下,条件是赋值,因此如果总是求值为true,那么来自编译器的建议。

答案 5 :(得分:0)

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