2016-02-28 93 views
-1

我认为这个问题是不是的网站上的其他问题重复,因为别人不给这个功能的使用C.int k = k;这个声明如何以及为什么起作用?

我想知道为什么这个C程序是不会放弃编译时错误。此外,为什么这个陈述有效。它有什么用途?

int main(int argc, char const *argv[]) 
{ 
    int k = k; 
    return 0; 
} 

在全球范围内没有k。看起来k的范围看起来就在赋值运算符后面。我很困惑。

+0

事实上,声明名称的范围从声明符结束后开始,即在您的案例的'='符号处。即使有一个全球性的“我”,那个“我”也会被新申报的“我”隐藏起来。你可以制作一些可疑但合法的代码,例如, g:'int f(int * p),i = f(&i);' – ach

+0

在编程的世界里,“它起作用/似乎正常工作/曾经工作过”是一个非常微妙的陈述 – user3528438

+0

RE:your edit-there *是*没有用处,它是未定义的行为 –

回答

3

int i = i;的定义初始化(左)i与(右侧未初始化值)i(所述相同变量)。

这肯定是未指定的行为,可能是undefined behavior

实现当然不会总是检测到未定义的行为(始终可靠地检测它们可以证明与halting problem相当)。

但你真的应该是非常不确定的行为scared。这是你的责任,以避免它。

+0

这是不确定的行为 – 4pie0

相关问题