C-在c语言中,怎样让a ==a不成立??
if (a == a)
printf("yes");
else
printf("no");
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
if (a == a)
printf("yes");
else
printf("no");
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
这个答案是错误的,大家请看 @灵剑2012 的回答留在这个当作给大家当作参考吧。
C++可以达到这个目的,方法是重载==操作符,对a的类型的==操作进行重载,使得该操作始终返回false即可。(这个有点和题目不合,但是感觉应该有用,所以写在这里了)
C不可以重载操作符,为了达到打印出no的目的,我能想到的有两种方式(有什么疏漏,敬请指正):
1.在a == a赋值的中间a的值发生变化,类似a == ++a的样式
add:上述情况可以在多核多线程环境下实现,实现方条件,编译器不进行优化,从而对a==a的比较使用了两个寄存器(基本上现代的编译器都不会的),从而a == a有两次访存的操作,在第一次操作之后,其他线程对a进行了修改,第2次操作得到的a值发生变化,达到这种效果,这种办法没有办法通过在if前加语句实现。
2.a无法进行 == 判断,类似javascript的undefined
1.我想到的一个方式是,把a的值和PC绑定到一起,但是判断指令在CPU上是用一条指令执行的,更精确的说,在取a的值的时候,a是放在同一个寄存器进行操作的,利用sub指令,或者beq等指令,进行的,即它是原子的操作,无法添加(这句错了,有可能不是原子的)。而使用struct模拟类(对struct无法直接进行比较),因为此时a实际保存的只是地址,在操作的过程中,对struct的改变是不影响地址的,所以也不行。而且,我也没有找到办法控制a在被使用时递增,js可以得到吗?好像也不可以。
2.C语言的设计中,基本类型不能满足条件,结构类型,还有指针类型,都是地址,也被认为是可以比较的,在只谈论比较的情况下,可以看作整型(地址)。也可以比较。C语言中只有false和true两种bool值,不会产生无法判断的情形。
#define a 0 && 0
注意到运算优先级的问题,
if(a == a)
会被替换成
if(0 && 0 == 0 && 0)
由于与运算优先级低,结果当然就会变成0(false)
如果a是浮点数的话
float a = 0.0f;
a /= a;
if (a == a)
printf("yes");
else
printf("no");