这是我的简单程序
char *array = 1==1;
if((bool)array == true)
printf("true");
Output: true
但是当我在
中更改数组时*array = 1==2;
Output: true
我不知道为什么它总是如此。我只想打印变量array
中的字符串是true
还是false
。
答案 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");
}
}
实际上是任何其他值,那么比较将为真。