总是在C中成真

时间:2015-10-14 08:30:12

标签: c boolean

这是我的简单程序

char *array = 1==1;
if((bool)array == true)
printf("true");

Output: true

但是当我在

中更改数组时
*array = 1==2;
Output: true

我不知道为什么它总是如此。我只想打印变量array中的字符串是true还是false

4 个答案:

答案 0 :(得分:6)

如果你这样做:

char *array = 1==2;

然后(bool)array 错误,就像您期望的那样,因为您刚刚编写了一种非常奇怪的方法将指针'array'设置为null(零)。

然而,如果相反,你做

char *array = 1==1;
*array = 1==2;

然后你所做的是初始化array成为指向地址'1'的指针,然后将'false'(零)写入该地址。这几乎肯定会使你的程序在任何现代平台上崩溃,尽管在一个小型嵌入式平台上可能会发生其他事情(可能对你来说很意外)。

答案 1 :(得分:3)

您正在检查指针本身,而不是它指向的东西。而且,您将指针初始化为非零地址:

char *array = 1==1; // array has value 1

在C中,所有非零都是" truthy",因此值为1的指针将在布尔上下文中计算为true

执行此操作时仍然具有非零地址的原因

if((bool)array == true)

是你在初始化后永远不会改变它的值。而是设置它指向的东西的值:

*array = 1==2; // write 0 to whatever is at address 1!

这不会改变array本身的值。它很可能通过写入您不应该写入的地址而导致未定义的行为。

答案 2 :(得分:1)

程序行为在两个方面是未定义的。第一个是演员bool。这是一个不相关类型的演员。编译器保留吃猫的权利。

第二个更微妙:

1==2是一个值为0的表达式。(请注意,在C ++中它是false。)

1==1是一个值为1的表达式。(请注意,在C ++中它是true。)

所以你设置一个指向0或1的指针。因为你没有拥有那个内存,即使读取指针值也是未定义的,更不用说解除引用< / em>它(你没有尝试过)。

答案 3 :(得分:0)

char *array = 1==1;
if((bool)array == true)
printf("true");

抛出编译器警告。做这样的事情,而不是:

int a = 0;
if ( a == true )
   {
   printf("true");
   }
else
   {
   printf("false");
   }

那将返回false。因为如果anything == True anything,如果@Getter @Setter @ManagedBean @ViewScoped public class LoginController implements Serializable { private static final long serialVersionUID = 1L; private String userName = "admin"; private String password = "123"; public void doLogin() { System.out.println("test"); } } 实际上是任何其他值,那么比较将为真。