LINUX.ORG.RU

Оператор , (sequencing) и инструкция return в C/C++


0

0

Всем привет!
Я написал простенькую программу:

#include <stdio.h>
int f1()
{
   printf("Entering f1\n");
   //...
   printf("Exiting f1\n");
   return 0;
    
}
 
int f2()
{
   printf("Entering f2\n");
   //...
   return f1(),printf("Exiting f2\n");  // !!!
}

int main()
{
   printf("Entering main\n");
   f2();
   printf("Exiting main\n");
}

Вывод программы следующий:
Entering main
Entering f2
Entering f1
Exiting f1
Exiting f2
Exiting main

Всё правильно!

Но вот я не очень понимаю как работает строка
return f1(),printf("Exiting f2\n");  // !!!
Разве это допустимо?
Как это выполняется, в какой последовательности?

Может результат, полученный мной, зависит от реализации?

Допустимо, общее значение выражения с запятой это значение с правой стороны от запятой.

SatanClaus ★★★
()

Выполняется так:

{ ... f1(); return printf("...."); }

Все легитимно бог знает с какого года, более того ',' является операторм и ее можно перегрузить

anonymous
()

Ты бы почитал про оператор "запятая" ...

Сначала левая часть, потом правая. Результат - то, что справа (в твоем случае это то, что вернул printf)

anonymous
()

2Krivenok_Dmitry :

Как я понимаю, твои проблемы в том, что ты (мысленно) неверно расставил скобки:

(return f1()),printf("Exiting f2\n");

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

2Die-Hard 
Мне то нужно чтобы и вывод программы был корректен (как в примере) и
возвращаемое значение f1 должно быть не тем, что вернул printf, а 
результатом вызова другой функции (f2).

Т.е. в return я вынужден буду возвращать переменную, предварительно
инициализировав её возвр-ым значением ф-ии.
int i = foo(); printf(...); return i;
вместо
return foo(),printf(...);

Не очень красиво.

Может можно ещё как-то задачку решить?

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от anonymous

>int i; 
>return i=foo(),printf("...."),i; 
Это правильно, но не красиво

>return printf("..."),foo();
Это не правильно, т.к. будет выведено:
Exit f1
Enter f2
Exit f2

При вызове f2 из f1

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Если ты маньяк (а это, судя по всему, так и есть), напиши return f()+0*printf(..). Гарантируется ли порядок исполнения (сначала слева от плюса, а потом справа) я, к стыду своему, не помню.

anonymous
()
Ответ на: комментарий от Krivenok_Dmitry

На мой взгляд, в общем случае нужно присвоить результат f() некоторой переменной, которую потом нужно вернуть. Как нужно действовать настоящему маньяку - извини, не в курсе ;)

anonymous
()
Ответ на: комментарий от Krivenok_Dmitry

use RAII, do not invent triangle wheels..


// this is a one-liner class 
class printer { std::string m ; public printer(char* f) : m(f) {} ~printer(){std::cout<<m;}} ;

int foo ()
{
  printer("ha ha") ;
  return f1() ;
}

omerm
()
Ответ на: комментарий от omerm

Не очень подходит, потому как заказывали печать результата f1().

Кроме того, поскольку f1() по условиям задачи умеет возвращать разные типы (точнее, существуют f2 и т.д. с другими типами возвращаемых значений), то printer д.б. шаблонным.

Если предположить, что для возвращаемых функциями значений определен ostream::operator<<(), то все можно было бы себе представить так

template <class T> class printer { T& m ; public printer(T& f) : m(f) {} ~printer(){std::cout<<m;} };

Явного указания параметра шаблона требоваться не должно и этого, насколько я понимаю, будет достаточно.

int foo () { return printer(f1()); }

Во всем этом идиотизме есть одна крошечная неувязка - конструктор, однако, не умеет возвращать значений.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.