Добрый день, друзья. Необходима помощь в одном непростом вопросе. Как вот такое (C++): Код (Text): { int i; while ((i = Func1()) != Func2()) Func3(); } записать одной строкой, без нарушения стандарта С++? Необходимо как-то внести объявление int i в while, но а) while ((int i = Func1()) != Func2()) Func3(); - нельзя б) while (int i = Func1() != Func2()) Func3(); - можно, но нарушится порядок, оператор сравнения имеет больший приоритет, чем оператор присваивания и будет выполнен первым. Второй вариант - основываясь на стандарте Си++ ISO/IEC 14882:2003 доказать, что это невозможно. Вот размышляю...
стр. 125 Стандарта 6.5 Iteration statements Iteration statements specify looping. iteration-statement: while ( condition ) statement Не могу пока найти в стандарте, точное описание condition - это и x>y и int x=5 - всё это condition будет...
qqwe C for проще: Код (Text): for (int i = Func1(); i != Func2(); i=Func1()) Func3(); тоже самое - эквивалентно; Мне в while надо - либо записать, либо доказать, что невозможно...
Видимо невозможно записать, по стандарту: condition это: либо expression либо type-specifier-seq declarator = assignment-expression Других вариантов нет.
я чет не понял условие задачи, но помоему наиболее близкое будет что-то типа: Код (Text): while(int i = Func1()) if(i != Func2()) Func3(); else break; можно было бы заюзать тернарный оператор, но похоже, что использовать ключевое слово break в тернарном операторе некорректно с точки зрения стандарта: Код (Text): while(int i = Func1()) (i != Func2()) ? Func3() : break; а если еще подумать, то вот еще... не совсем корректно, но все же: Код (Text): while(int i = Func1() && i != Func2()) Func3(); а чтобы исключить выход из цикла при нулевом возврате из Func1 можно сделать такую штуку: Код (Text): while(((int i = Func1()) && 1) && i != Func2()) Func3();
Rel Я Вас успокою, никто так и не пишет, разве не очевидно, что подобными примерами программисты передают концепцию... Ваш вариант Rel: к сожалению не эквивалентен: Переменной i в Вашем варианте, на каждой итерации будет присваиваться значение выражения ( Func1() && i != Func2() )- так уж while работает, а должно присваиваться значение выражения Func1(). Вот чистый эквивалент - оптимизированный for: Код (Text): for (int i; (i = Func1()) != Func2(); ) Func3();
Кто-нибудь может сказать, на каких основаниях компилятор gcc не пропускает конструкцию: while((int i = func1()) != func2()) func3(); Где нарушение стандарта - почему конструкцию (int i = func1()) gcc не парсит как expression?
valterg gcc test.cpp -lstdc++ g++ test.cpp Эквивалентно. И g++ и gcc компилируют С++ код. Суть вопроса в другом.
скобки поставьте правильно, как в последнем моем варианте... не, ну а что трололо-то? допустим такой код собирается gcc и работает как часы: Код (Text): #include <iostream> template <int b> class A { public: virtual void Test(int a) { std::cout << "Test A: " << a << " " << b << std::endl; } }; template <int b> class B : public A<b + 100> { }; int main() { int n = 0; std::cout << "Hello World!" << std::endl; B<200> b; b.Test(100); std::cin >> n; return 0; }