петак, 27. новембар 2009.

Секвентна тачка

Односно "Sequence point".

Питање у вези секвентне тачке (ако сам превео добро) често долази на разговорима за посао. Многи нису свесни шта је то иако је у суштини проста ствар. Пре неки дан ме на то потсетио бивши колега, а и ја сам то питање добио на мом разговору.

Секвентна тачка је синтаксни елемент дефинисан језиком који гарантује да ће споредни ефекти евалуације израза са леве стране таквог елемента гарантовано бити завршени пре него што започне евалуација израза са десне стране.

На пример, у Цеу и Це++ то је оператор зарез ',' али не и аримтетички оператори. Осим зареза, има још секвентних тачака као што су '?' и логички оператори.

Кратак, али добар текст се може наћи на википедији.

5 коментара:

  1. Занимљиво. Мораћу то да запамтим за тражење посла следеће године, ако Бог да. :-)

    Узгред, у Паскалу се логички оператори не извршавају секвенцијално као у Цеу, бар не подразумевано.

    ОдговориИзбриши
  2. Сада читам на википедији да стандардни паскал не дефинише редослед израчунавања и захтева евалуацију читавог логичког израза - то нисам знао.

    У борландовом турбо паскалу сам много радио до пре отприлике 10 или нешто више година.

    Колико се сећам (ако се сећам), логички изрази су се у борландовом ТП-у изврачунавали са лева на десно и евалуација престаје када је резултат познат (слично ц-у). Међутим, за разлику од Ц-а, постоји опција (чини ми се приликом компајлирања) којом се може задати комплетна евалуација.

    ОдговориИзбриши
  3. Не, колико се _ја_ сећам, ;-) У ТП-у/БП-у се по жељи може укључити *цеовско* извршавање израза, јер се стандардно у Паскалу извршавају сви делови логичког израза. Зато је уместо:

    if (my_ptr <> nil) and (my_ptr^.some_field = 15) then
    begin
    {...}
    end;

    најсигурније писати нешто као:

    if my_ptr <> nil then
    begin
    if my_ptr^.some_field = 15 then
    begin
    {...}
    end;
    end;

    ОдговориИзбриши
  4. Ја сам радио само са турбо паскалом, зато нисам ни знао да би твој пример у стандардном паскалу правио проблем.

    Добро је да си то прокоментарисао јер сам научио нешто ново.

    Ради комплетности, ево стране на којој се описује подразумевани начин рада турбо паскала ("цеовско" односно "краткоспојно" израчунавање логичких израза). На истој се помиње и опција компајлера којом се обезбеђује понашање у складу са стандардом.

    Књига "Turbo Pascal, Fourth Edition, Nell Dale, Chip Weems", страна 174.


    Уколико ради, ова веза води директно на ту страну гуглових књига:

    http://books.google.com/books?id=XFaB8rDpUjYC&lpg=PA174&ots=rMqfJ31--1&dq=turbo%20pascal%20logical%20expression%20evaluation&pg=PA174#v=onepage&q=turbo%20pascal%20logical%20expression%20evaluation&f=false

    ОдговориИзбриши