C++ 是i的值,定义如下:int i,j=1;

C++ 是i的值,定义如下:int i,j=1;,c++,C++,鉴于: 是否定义了i的值?如果是,是什么 我怀疑这是一个重复,但搜索起来有点困难-如果有人能找到它,请告诉我。如果这是定义局部变量,则不会定义I的值。不,它没有定义,编译器应该抱怨如果您试图使用它,这取决于语言。如果此代码在全局范围内,然后i将为0。否则将不定义i。int i是一个定义语句,但未为其赋值 Extern inti是声明。 全局变量由 默认为其默认值(0 (适用于int) 局部变量未初始化 默认情况下 例如: int i, j = 1; #包括 int a,b=1;//a=0,b

鉴于:

是否定义了
i
的值?如果是,是什么


我怀疑这是一个重复,但搜索起来有点困难-如果有人能找到它,请告诉我。

如果这是定义局部变量,则不会定义
I
的值。

不,它没有定义,编译器应该抱怨如果您试图使用它,这取决于语言。

如果此代码在全局范围内,然后
i
将为0。否则将不定义
i

int i
是一个定义语句,但未为其赋值

Extern inti
是声明。

  • 全局变量由 默认为其默认值(0 (适用于int)
  • 局部变量未初始化 默认情况下
例如:

int i, j = 1;
#包括
int a,b=1;//a=0,b=1
内部主(空){
int p,q=1;//p=undf,q=1
返回0;
}
局部变量的证明:

#include <iostream>

int a, b=1; // a=0, b=1

int main(void) {
 int p, q=1; // p=undef, q=1
 return 0;
}
#包括
内部主(空){
{
int x=99;//更改堆栈的位置
}
int a,b=0;

std::cout您显示的代码相当于:

#include <iostream>
int main(void) {
  {
    int x = 99; // change stack where a would be
  }
  int a, b=0;
  std::cout << a << std::endl;
  return 0;
}

这意味着,
i
已定义,但未初始化。

i
将未定义。如果您尝试使用
i
而不为其赋值,则会导致未定义的行为

任何好的编译器都会警告你类似的事情。使用类型为
int
的未定义变量可能是无害的,但不要使用未定义的指针

也许不是今天,但在一段时间以前,在没有足够的硬件和软件保护之前,使用带有未初始化变量的指针可能会损坏机器的BIOS


这个故事的寓意是:如果它没有初始化,就不要使用它。

这个变量可以包含从0到垃圾的任何内容。 请参考以下链接


有关详细信息

抱歉,我没有注意到。我认为这取决于编译器--Windows DDK编译器现在给了我一个警告,但它确实取决于编译器。我尝试过的两个编译器并不总是抱怨(尝试在
for
语句的第三位使用它-
for(;;+I)
)Windows DDK编译器:<代码> TEMP.CPP(4):警告C47:本地变量“i”使用而不被初始化可能是因为您断言编译器应该抱怨。没有这样的要求,我可以看到。(并且语言是C++的OP标签)。我说编译器应该抱怨,而不是说它必须抱怨。:)一个好的编译器会抱怨,一个平庸的编译器不会。我想我可以看出另一个原因…尽管我会说这有点苛刻。哦,好吧。:)我没有定义,但声明。@Mihran请检查他们指定的这个链接。。在一些教科书中他们也这样指定。。如果我错了,我会更新我自己,无论如何谢谢..+1,因为我识别了我将被定义,如果它有文件作用域。我认为,定义和初始化通常被认为是指同一件事,即引用变量的值。要明确的是:变量是声明的,但它的值没有定义或初始化。标准说:'A decl'aration可能会将一个或多个名称引入翻译单元…(请参见3.1.1[basic.def]),而“声明是一个定义,除非…它包含外部说明符…且没有初始值设定项…”(请参见3.1.2[basic.def])。这意味着
int i;
是一个定义(无
extern
).声明、定义和初始化变量是三件不同的事情。
int i;
int j = 1;