我有这个代码,我不明白
当我编译以下代码时:
#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
,它将分配一个从y
到x
的值,然后将表达式视为if(x)
,然后将其评估。
现在在这里,如果x
具有0
,则if(x)
将视为false,否则为true。
因此,x=y
不会以输出为输出。