В стандарте
C++ 17 предложение
if определяется следующим образом:
selection-statement:
if constexpropt ( init-statementopt condition ) statement
if constexpropt ( init-statementopt condition ) statement else statement
Оставим пока в стороне спецификатор
constexpr и обратим внимание на то, что в новой редакции предложения
if помимо условия (c
ondition), которое в свою очередь может быть объявлением, можно вставлять перед ним предложение объявления (i
nit-statement).
Это позволяет сузить область объявления переменных, которые должны использоваться только внутри
if предложения.
Следующий, несколько искусственный пример показывает, как теперь может выглядеть в отдельных случаях
if предложение.
#include <iostream>
#include <iterator>
#include <cstring>
char guess_character()
{
std::cout << "Enter a character: ";
char c;
if ( not ( std::cin >> c ) ) c = '*';
return c;
}
int main()
{
if ( const char c = guess_character(), *s = "Hello World!"; const char *p = std::strchr( s, c ) )
{
std::cout << "\'" << c << "\' is found at positioon " << std::distance( s, p ) << ".\n";
}
else
{
std::cout << "\'" << c << "\' is not found." << '\n';
}
}
Вывод программы на консоль может, к примеру, выглядеть следующим образом:
Enter a character: W
'W' is found at positioon 6.
Или более итеративный вариант показанной программы.
#include <iostream>
#include <iterator>
#include <cstring>
char guess_character()
{
std::cout << "Enter a character ('*' - exit): ";
char c;
if ( not ( std::cin >> c ) ) c = '*';
return c;
}
int main()
{
while ( true )
{
if ( const char c = guess_character(), *s = "Hello World!"; const char *p = std::strchr( s, c ) )
{
std::cout << "\'" << c << "\' is found at positioon " << std::distance( s, p ) << ".\n";
}
else
{
if ( c == '*' ) break;
else std::cout << "\'" << c << "\' is not found." << '\n';
}
}
}
Вывод программы может выглядеть как
Enter a character ('*' - exit): W
'W' is found at positioon 6.
Enter a character ('*' - exit): A
'A' is not found.
Enter a character ('*' - exit): *