У меня есть проект C++/CLI, который объявляет переменную String^ внутри цикла for, но не инициализирует ее. На первой итерации переменной присваивается некоторое значение. На каждой последующей итерации он сохраняет предыдущее значение. Не должна ли переменная в локальной области инициализироваться нулевым (или эквивалентным) значением каждый раз в цикле? Это происходит и с int. Кроме того, компилятор не предупреждает о потенциально неинициализированном значении, если я не устанавливаю уровень предупреждения на W4, и даже тогда он предупреждает только для int, а не для String^.
Это пример кода, который показывает поведение.
#include "stdafx.h"
using namespace System;
int main(array<System::String ^> ^args)
{
for(int n = 0; n < 10; n++)
{
String^ variable;
int x;
switch(n)
{
case 1:
variable = "One";
x = 1;
break;
case 5:
variable = "Five";
x = 5;
break;
}
Console::WriteLine("{0}{1}", variable, x);
}
}
Результат этого будет
One, 1
One, 1
One, 1
One, 1
Five, 5
Five, 5
Five, 5
Five, 5
Five, 5
Я совершенно неправильно понимаю, как должны быть инициализированы переменные с локальной областью? Является ли эта «функция» уникальной для управляемого С++? Если я преобразую это в С#, компилятор предупредит об обеих переменных даже на базовом уровне предупреждения.