[英]ANSI C (1989): is it possible to init a variable with an OR?
我需要分析一些代码,但我不明白为什么该表达式总是给我相同的结果,在此示例中为字母“ b”。
unsigned char ucVal2;
ucVal2 |= 0x62;
我一直以为,当您不定义变量时,它的值是不确定的。.因此,在这种情况下,我假设ucVal2的值应该是SOMETHING或0x62,但是执行总是向我显示ucVal2是0x62,就像SOMETHING始终是0x00。
那可能只是运气。 或者您的特定编译器和/或OS可能会保证将内存初始化为0,即使C语言本身没有将其初始化。
根据该标准, ucVal2
的值未定义,并且以上代码不可移植。 使用像这样的|=
运算符没什么特别的,它在某种程度上会影响其未定义的事实。
如果ucVal2
在文件范围内定义(即“全局”),则它将始终被初始化为0。如果在函数范围内声明,则不会被初始化,其值将是随机的。
非确定性与random不一样。
仅仅因为不能保证未初始化变量的值并不意味着您无法合理地猜出该值是什么。
计算机启动后,大多数内存最终为零。 在一个进程写入它之前,它将继续为零。 当您的程序声明此未初始化的变量时,该值很可能仍为零。 但是您不能保证它会为零。
您绝对不能依赖于零。 仅仅因为变量在连续的一千个测试中从零开始,而对于千千个测试,它可能完全不同。
访问未初始化变量的内容是未定义的行为。 这意味着它可以是非确定性垃圾,确定性垃圾或零。 该程序甚至可以在您访问时自由崩溃和刻录,尽管在大多数系统上不太可能。
可以将其想象成好像盲目地将手伸入公共垃圾箱中:它可能是空的,可能包含或多或少令人作呕的垃圾,里面可能有一只巨大的老鼠咬断了您的手。 无法保证您会想到什么。
试图理解为什么某种未定义的行为会产生某种结果并不是特别有意义,它通常只会产生很少或没有有用的知识。
如果我们要猜测的话,那么堆栈上的垃圾就是一些程序预初始化代码或以前执行的函数的遗留物。 在这种情况下,垃圾的性质可能具有确定性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.