if 문 다음에 나오는 변수 선언
다른 포럼에서 문제가 발생했고 해결 방법을 알고 있었지만 나만의 컴파일러 기능이 드러났습니다. 그 사람은 대괄호없이 if 문 다음에 변수를 선언했기 때문에 "포함 된 문은 선언이나 레이블이 지정된 문이 될 수 없습니다"라는 오류가 발생했습니다. 그것은 그들의 의도는 아니었지만 if 문 바로 다음에 나오는 코드 줄을 주석 처리하여 변수 선언을 사실상 실행할 코드 줄로 만들었습니다. 어쨌든, 그것이 배경입니다.
다음 코드는 불법입니다
if (true)
int i = 7;
그러나 괄호로 묶으면 모두 합법적입니다.
if (true)
{
int i = 7;
}
두 코드 모두 유용하지 않습니다. 그러나 두 번째는 괜찮습니다. 이 동작에 대한 설명은 구체적으로 무엇입니까?
C의 # 언어 사양의 진술의 세 가지 유형을 구별는 (자세한 내용은 8 장 참조). 일반적으로 다음 명령문을 가질 수 있습니다.
- 라벨이 붙은 진술 -이것이 구식
goto
진술에 대한 것 같습니다 . - 선언문- 변수 선언
- 임베디드 문 -거의 모든 나머지 문을 포함합니다.
에서 if
문 몸이되어야합니다 임베디드 문 코드의 첫 번째 버전은 작업을하지 않는 이유를 설명. 다음은 if
사양 의 구문입니다 (섹션 8.7.1) :
if ( boolean-expression ) 임베디드 문
if ( boolean-expression ) 임베디드 문 else 임베디드 문
변수 선언은 declaration-statement 이므로 본문에 나타날 수 없습니다. 선언을 대괄호로 묶으면 명령문 블록이 생성되는데, 이는 포함 된 문 (따라서 해당 위치에 나타날 수 있음)입니다.
대괄호를 포함하지 않으면 대괄호로 둘러싸인 것처럼 다음 줄을 실행합니다. 해당 줄에서 변수를 선언하는 것은별로 말이되지 않기 때문에 (사용할 수 없을 것입니다), C # 컴파일러는 사용자가 알지 못하는 사이에 실수로 수행하는 것을 방지 할 수 없습니다 (미묘한 버그가 발생할 수 있음). ).
다음은 Eric Lippert가 이름 확인에 대한 이 SO 답변 에 대한 C # 컴파일러에 대해 말해야하는 부분입니다 .
... C #은 "사용자가 의미하는 바를 추측"하는 언어가 아닙니다. 설계 상 컴파일러는 최적의 일치가 작동하지 않는 것이면 크게 불평합니다.
모든 컴파일러를 사용하면 쓸모가 없거나 사용률이 매우 낮은 코드를 컴파일 할 수 있습니다. 개발자가 언어를 사용하여 사용하지 않고 구문을 만들 수있는 방법은 너무 많습니다. 컴파일러가 그것들을 모두 잡아내는 것은 너무 많은 노력이며 일반적으로 가치가 없습니다.
두 번째 경우는 섹션 8.0이 시작될 때 C # 언어 사양에서 직접 호출됩니다.
이 예에서는 if 문에 if 분기에 대한 문이 아닌 포함 문이 필요하기 때문에 컴파일 타임 오류가 발생합니다. 이 코드가 허용되면 변수 i가 선언되지만 사용할 수 없습니다. 그러나 블록에 i의 선언을 배치하면 예제가 유효합니다.
예제 코드
void F(bool b) {
if (b)
int i = 44;
}
if의 else 부분에 닫는 중괄호와 여는 중괄호를 추가하면 내가 추가하기 전에했던 것과 반대로 아래에서 한 것처럼 도움이되었습니다.
이전 : 이로 인해 오류가 발생했습니다.
protected void btnAdd_Click(object sender, EventArgs e)
{
if (btnAdd.Text == "ADD")
{
CATEGORY cat = new CATEGORY
{
NAME = tbxCategory.Text.Trim(),
TOTALSALEVALUE = tbxSaleValue.Text.Trim(),
PROFIT = tbxProfit.Text.Trim()
};
dm.AddCategory(cat, tbxCategory.Text.Trim());
}
else
// missing brackets - this was causing the error
var c = getCategory();
c.NAME = tbxCategory.Text.Trim();
c.TOTALSALEVALUE = tbxSaleValue.Text.Trim();
c.PROFIT = tbxProfit.Text.Trim();
dm.UpdateCategory(c);
btnSearchCat_Click(btnSearchCat, e);
}
이후 : else 분기에 대괄호 추가
protected void btnAdd_Click(object sender, EventArgs e)
{
if (btnAdd.Text == "ADD")
{
CATEGORY cat = new CATEGORY
{
NAME = tbxCategory.Text.Trim(),
TOTALSALEVALUE = tbxSaleValue.Text.Trim(),
PROFIT = tbxProfit.Text.Trim()
};
dm.AddCategory(cat, tbxCategory.Text.Trim());
}
else
{
var c = getCategory();
c.NAME = tbxCategory.Text.Trim();
c.TOTALSALEVALUE = tbxSaleValue.Text.Trim();
c.PROFIT = tbxProfit.Text.Trim();
dm.UpdateCategory(c);
}
btnSearchCat_Click(btnSearchCat, e);
}
참고 URL : https://stackoverflow.com/questions/2496589/variable-declarations-following-if-statements
'IT TIP' 카테고리의 다른 글
"ui-sref"를 조건부로 실행하는 방법은 무엇입니까? (0) | 2020.12.07 |
---|---|
dplyr의 mutate_each / summarise_each : 특정 열을 선택하고 변경된 열에 새 이름을 지정하는 방법은 무엇입니까? (0) | 2020.12.07 |
페이지의 특정 부분 만 표시하는 iframe (0) | 2020.12.07 |
문자열 매개 변수가있는 C # TrimStart (0) | 2020.12.07 |
const 비 정수 지수로 pow () 최적화? (0) | 2020.12.07 |