Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 警告:建议在用作真值的赋值周围加括号_C_If Statement_Compiler Warnings - Fatal编程技术网

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

C 警告:建议在用作真值的赋值周围加括号,c,if-statement,compiler-warnings,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; } 如果“=”不进行比较,而只是将y中的值放入x中,为什么要打印x=y。

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

当我编译以下代码时:

#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;
}

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

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

编辑: 这两行都是由于分配而打印的:

x=y的计算结果为真-因此打印第一行。 x=y是一个赋值,本质上是说x应该取y的值,在本例中为0。 同样地,第二行不应该写为0计算为false,但一般来说,这可能是一个bug或某个精度错误。这不应该发生在简单的赋值0中,但您永远不知道。

相等操作是==和=是赋值运算符

正确的形式是ifx==y,但它也将在ifx=y时运行

因为在这种情况下,if将首先计算x=y,然后从y到x分配一个值,然后将表达式视为ifx,然后进行计算

现在,如果x有0,那么ifx将视为false,否则为true


因此,x=y将不会得到打印输出。

这是一个建议,可能是您在打字

通常,您将有:

if(condition)
在您的情况下,条件是一个赋值,因此如果总是求值为true,则编译器会给出建议

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=根据我的解释,你是意料之中的


使用gcc运行您的代码,您将正确地看到它。。。我所能想到的是,你正在运行一个奇怪的非C标准编译器,它在指定y之前检查x的值。

丹尼尔·菲舍尔已经回答了你的问题。您正在测试x=y。没有,所以你的第一次测试是正确的。然后将y赋值给x,x在工作时返回true,并输出第二条print语句。

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

关于这个问题:由于x=y的计算结果为y,并且y为0,因此结果是错误的,因为这是C标准所说的应该发生的。从6.3.1.2开始:

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


因此,运行此代码不应该打印equals消息,这是事实。

我知道。它仍然没有回答我的问题,也没有为我打印x=y。哦,很抱歉,没有看到您似乎也得到了x=y输出。这只能发生在完全阻塞的编译器上,因为y是0。你用哪种编译器?-1来表示不可复制的东西。我猜你运行的输出x=y的程序与你发布的程序不完全一样。是否未重新编译源更改?或者以其他方式运行了错误的二进制文件?这并不能解释为什么x=y应该被打印。马里奥,你错过了真正的问题。另外,它是不可复制的,至少在我的OSX系统上是不可复制的,所以至少对我来说,它是无法回答的。更新了我的答案。这很可能是一些错误或精度问题,尽管在这种情况下它真的不应该发生,因为你甚至没有做任何计算。但是y是零,当我运行它时,没有x=y输出。这个问题是不可复制的,因此无法回答。听起来好像是编译器的怪癖。您尝试使用哪个编译器?将y指定给x不会返回true。它返回y的值,在本例中为0。它的计算结果始终为true?分配零的时候呢?这并不能解释所报道的行为,因为这个问题无法重现,所以很难回答。我想你可能会说你运行的程序与你发布的程序稍有不同。因为当你执行x=y时,它会将y的值赋给x,而x的值为零。@wantToLearn,但y的值为零意味着x=y不应该被打印,显然不适用于任何其他人。挑剔:标准确实在6.3.1.2中说,但这并不是then分支被忽略的原因,因为 OP的程序中没有转换成布尔。未采用then分支的原因是6.8.4.1:2“如果表达式不等于0,则执行第一个子语句”。6.8.4.1:1中的唯一约束是“if语句的控制表达式应具有标量类型。”
if (x == y) // if x is the same value as y