Это не секрет или расширение GCC. Переменные допускаются к объявлению в условиях таких вещей, как if
s, while
s, и switch
es. Например:
while (char c = cin.get()) { ... }
или
if (int* something = (int*)malloc(4)) { // but don't use malloc in C++
// ...
}
После того, как они объявлены инициализированы, они преобразуются в значения bool
и если они оценивают, чтобы true
блок выполняются, и блок пропускаются в противном случае. Их область охвата такова, что конструкция, состояние которой они объявлены (а в случае if
, область охвата также охватывает все блоки else if
и else
).
В §6.4.1 стандарта на C++ 03, он говорит
заявления Выбор выбрать один из нескольких потоков управления.
selection-statement:
if (condition) statement
if (condition) statement else statement
switch (condition) statement
condition:
expression
type-specifier-seq declarator = assignment-expression
Так как вы можете видеть, это позволяет type-specifier-seq declarator = assignment-expression
в состоянии с if
или switch
. И вы найдете что-то подобное в разделе для «конструкций повторения».
Кроме того, switch
эсов работать на целом или enum
типов или экземпляров классов, которые могут быть неявно преобразованы к интегральному или enum
типу (§6.4.4):
Величина условия, что является инициализированным объявлением в операторе switch - это значение объявленной переменной, если оно имеет интегральный или перечисляемый тип, или этой переменной, неявно преобразованной , в интегральный или нулевой тип в противном случае.
Я на самом деле узнал об этом FROM AN ANSWER YOU POSTED на вопрос «Скрытые особенности C++». Поэтому я рад, что могу напомнить вам об этом :)
Блок кода начинается с открывающей фигурной скобки, поэтому это не должно быть проблемой. –
Это один из трюков? Я чувствую, что к тому времени, когда у этого Q есть принятый ответ, я ощущаю что-то решительное, - –
О, я не понимал, что это был Йоханнес ... Я чувствую себя обманутым в ответ. –