我有这个代码,有些东西我不明白
编译以下代码时:
#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中。
答案 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)
然后它会评估。
现在如果x
有0
,那么if(x)
会视为错误,否则为真。
因此,x=y
不会将输出作为输出。
答案 4 :(得分:0)
这是一个建议,也许你正在写一个错字。
通常,您将拥有:
if(condition)
在你的情况下,条件是赋值,因此如果总是求值为true,那么来自编译器的建议。
答案 5 :(得分:0)
Daniel Fischer回答了你的问题。您正在测试是否x = y。它没有,所以你的第一次测试是真的。然后你将y分配给x,它在工作时返回true并导致输出第二个print语句。