用不同数据类型定义同一变量时C代码的工作

用不同数据类型定义同一变量时C代码的工作,c,C,我无意中命名了一个变量两次,但数据类型不同。它错过了编译错误,因为一个在main()中,另一个在while()循环的main()中 所以我做了一个这样的代码 #include <stdio.h> int main() { int t; scanf("%d",&t); while(t>0) { double t; scanf("%lf",&t); printf("%lf\n",t);

我无意中命名了一个变量两次,但数据类型不同。它错过了编译错误,因为一个在
main()
中,另一个在
while()
循环的
main()

所以我做了一个这样的代码

#include <stdio.h>

int main()
{
    int t;
    scanf("%d",&t);
    while(t>0)
    {
        double t;
        scanf("%lf",&t);
        printf("%lf\n",t);
        t--;
    }

return 0;
}
#包括
int main()
{
int t;
scanf(“%d”、&t);
而(t>0)
{
双t;
扫描频率(“%lf”、&t);
printf(“%lf\n”,t);
t--;
}
返回0;
}
在这里,我注意到这个节目永远不会结束!对于
double t
的任何输入值,无论是负值、正值还是零,
while()
循环都不会终止


有人能解释一下为什么会发生这种情况吗?while循环是如何在那里终止的?

你自己说的。有两个变量名为
t
,作用域不同

您声明的
double t
具有在while循环内执行的块的范围。while循环中的条件使用在while循环周围的作用域中声明的
t
int t
),该作用域从不被修改(因为循环隐藏
t
并修改双t),因此它永远不会达到0

以下是关于C中变量范围的一些要点:

  • 块继承所有全局变量
  • 在块内声明的变量仅在块内有效
  • 块可以嵌套
  • 嵌套块从外部块继承变量
  • 可以在嵌套块中声明变量,以隐藏外部块中的变量(例如在您的示例中)
编辑

正如@pmg所建议的,这里有几个额外的要点:

  • 隐藏变量根本无法访问,除非使用在其仍然可见时创建的指针
  • 虽然严格来说,隐藏变量不是一个错误,但它几乎从来都不是一件好事,而且大多数编译器在隐藏变量时都会发出警告
有人能解释一下为什么会发生这种情况吗

程序中有两个变量称为t。一个是main范围内的
int
,另一个是while循环范围内的
double
。在while循环中,双t隐藏int t,scanf设置双t

while循环如何在那里终止


程序不能像写入时那样从while循环内部终止。

当执行语句
t--
时,它引用了在同一块中先前声明的(
double t
)变量,因此您的
int t
在外部块范围内,它被
double t
隐藏,从不递减。

如果我将
t
的双精度值设为0或负值会怎么样?它已经不接受while循环的条件,因此循环应该中断?无论您给t什么,因为后面有一个scanf函数,分配的值将被覆盖。这是一个很好的问题。但我希望现在对你们来说这纯粹是学术性的。也就是说,我希望您刚刚重新命名了
t
-变量的名称。+1我知道“隐藏”变量根本无法访问,除非使用在仍然可见时创建的指针。
while(t>0)//int t;
{
    {
        double t;
        scanf("%lf",&t);
        printf("%lf\n",t);
    }
    t--;
}