在标准中,平等在§6.5.9“平等运算符”中讨论,&
在§6.5.3.2“地址和间接运算符”所讨论的,并且const
在§6.7.3“类型限定符”中讨论。关于指针相等的相关段落是§6.5.9。6:
两个指针比较相等当且仅当两者都是空指针,两者都是指针指向 相同的对象(包括一个指向对象和在其开始处的子对象)或函数,[或指针过去的数组的末尾]
的&
唯一定义是,“一元&
操作者产生其操作数的地址。 [...]结果是指向由操作数指定的对象或函数的指针。“(第6.5.3.2.3节)。不幸的是,“地址”一词没有正式的定义。但是不同的对象(由==
定义的相等)具有不同的地址,因为地址是由上面的相等定义区分的指针。
关于const
的含义,第6.7.3节并未指出const
与什么使对象(它是“执行环境中的数据存储区域,其内容可以表示值“由§3.14)。脚注还指出,“如果从未使用地址,则实现不需要为这样的对象分配存储空间”。虽然这是非规范性的,但是强烈指示如果使用地址,则必须为每个对象分配存储空间。
注意,如果对象是const volatile
,那么它是相当明确的(如清楚volatile
可以永远),他们不能有相同的地址,因为const volatile
对象是由实现可变的。 (§6.7.3.10有一个使用const volatile
的示例。)
即使在非易失性情况下,const
也只是表示该程序的这部分不允许修改该对象,而不是该对象是只读的,只在一般情况下。要将const
对象的存储与其他内容合并,大胆的实现者必须保证没有任何东西可以修改对象。对于具有外部链接的对象而言,这对于单独编译的实现来说是相当困难的(但当然,我们正在摆脱标准并进入不可能发生的实践领域)。
如果这是写一个C程序,那么你可以通过给物体不同的值增加你的机会:
const int x = __LINE__;
const int y = __LINE__;
如果这是C的有关理论模型,我会去制作对象不同。您必须通过在您的论文(扩展版)中的段落中总结答案来证明这一选择是合理的。另一方面,如果这是关于编写优化编译器的问题,我怀疑这会伤害许多真实世界的程序来合并常量。我会在嵌入式编译器中进行合并,用户习惯于在边缘情况下安全地播放它,并且保存的内存可能不可忽略。我会反对在托管平台上合并,任何收益都可以忽略不计。
(从N1256又名C99 + TC3引用。我不认为版本有差别。)
注意,GCC将只能发出'x'和'y'如果可以采取的地址,并在这种情况下,它会在不同的地址发出它们。 – ninjalj 2011-06-04 13:10:59
另请参阅:[C语言中的Const限定符深度分析](http://stackoverflow.com/questions/4275504/deep-analysis-of-const-qualifier-in-c) – 2011-06-04 14:12:46