Каква е разликата между оператора запетая и разделителя запетая?

  • В C++ токенът със запетая (т.е. ,) се интерпретира или като оператор със запетая, или като разделител със запетая.

  • Въпреки това, докато търсих в мрежата, осъзнах, че не е съвсем ясно в кои случаи токенът , се интерпретира като двоичен оператор със запетая и къде се интерпретира като разделител между изразите.

  • Освен това, имайки предвид множество изрази/изрази в един ред, разделени с , (напр. a = 1, b = 2, c = 3;), има мътност в реда, в който се оценяват.

Въпроси:

  1. В кои случаи токен със запетая , се интерпретира като оператор и в кои като разделител?
  2. Когато имаме един ред множество изрази/изрази, разделени със запетая, какъв е редът на оценка за случая на оператора със запетая и случая на разделителя със запетая?

person 101010    schedule 15.06.2014    source източник
comment
@hackcks дубликатът, който маркирахте, се отнася изрично до извиквания на функции. Следователно този въпрос не е дубликат на този, който сте маркирали.   -  person 101010    schedule 16.06.2014
comment
Имате предвид „неясно“, когато казвате „мътност“?   -  person pmr    schedule 16.06.2014
comment
@40две; Прочетете приетия отговор.   -  person haccks    schedule 16.06.2014
comment
@pmr да, имам предвид, че редът на оценка за двата случая е неясен.   -  person 101010    schedule 16.06.2014
comment
За втората част от вашия въпрос: Редът на оценката за оператор със запетая е отляво надясно. Не е посочен ред за разделител със запетая.   -  person haccks    schedule 16.06.2014
comment
Заглавието на въпроса изглежда фалшиво. Текстът на въпроса показва, че знаете каква е разликата в поведението между оператора запетая и разделителя запетая; но вие задавате синтактичен въпрос за това в кои случаи символът за запетая указва оператор запетая.   -  person M.M    schedule 16.06.2014
comment
Въпросът ви е неясен, когато питате за множество твърдения в един ред. В показания пример за инициализация ли говорите или за присвояване? Поведението е много различно в двата случая.   -  person Praetorian    schedule 16.06.2014
comment
@Praetorian Моля за извинение за липсата на изразителност, поради факта, че не съм роден говорител, имам предвид и двата случая. Много ще се радвам на отговор с примери като този, който сте публикували. Къде бъдещият читател може да види в кой пример запетаята действа като оператор и в кой като разделител. Също така обосновка за подреждането отляво надясно на оператора запетая и същото за разделителя.   -  person 101010    schedule 16.06.2014


Отговори (2)


Не можете да използвате запетая за разделяне на изявления. , в a = 1, b = 2; е операторът запетая, чиито аргументи са два израза за присвояване. Редът на оценка на аргументите на оператора запетая е отляво надясно, така че е ясно какъв е редът на оценка в този случай.

В контекста на аргументите за извикване на функция, тези аргументи не могат да бъдат изрази със запетая, така че запетаите от най-високо ниво трябва да са синтактични (т.е. разделящи аргументи). В този случай редът на оценяване не е посочен. (Разбира се, аргументите може да са изрази в скоби, а изразът в скоби може да е израз със запетая.)

Това е ясно изразено в граматиката на стандарта C++. Съответните продукции са expression, които могат да бъдат:

assignment-expression

or

expression , assignment-expression

и expression-list, което е същото като initializer-list, което е ,-разделен списък от initializer-clause, където initializer-clause е или:

assignment-expression

or

braced-init-list

, във втората продукция expression е операторът запетая.

person rici    schedule 15.06.2014

Когато разделител е подходящ -- в аргументи на извикване на функция или макрос, или разделяне на стойности в списък на инициализатор (благодаря за напомнянето, @hackcks) -- запетаята ще бъде взета като разделител. В други изрази се приема като оператор. Например,

my_function(a,b,c,d);

е извикване, предаващо четири аргумента на функция, докато

result=(a,b,c,d);

ще се разбира като оператор запетая. Възможно е, чрез ugly, да смесите двете, като напишете нещо като

my_function(a,(b,c),d);

Операторът запетая обикновено се оценява отляво надясно.

Първоначалното използване на тази операция в C беше да позволи на макроса да извърши няколко операции, преди да върне стойност. Тъй като екземплярът на макрос изглежда като извикване на функция, потребителите обикновено очакват да може да се използва навсякъде, където може да бъде извикване на функция; ако макросът се разшири до множество изрази, това би победило това. Следователно C въведе оператора ,, за да позволи верижно свързване на няколко израза заедно в един израз, като същевременно отхвърля резултатите от всички, освен последния.

Както @hacks посочи, точните правила за това как компилаторът определя кое значение на , е предвидено, произтичат от граматиката на езика и преди това са били обсъждани на Как компилаторът знае, че запетаята в извикване на функция не е оператор със запетая?

person keshlam    schedule 15.06.2014
comment
, също се третира като разделител в списъка на инициализаторите. - person haccks; 16.06.2014