On Tue, Jan 18, 2005 at 11:59:36AM +0200, Zhasmin Zhelev wrote:
> Vasil Kolev wrote:
> 
> >On вт, 2005-01-18 at 00:11 +0200, George Danchev wrote:
> > 
> >
> >>бърз въпрос: Разликата между x++ и ++x е безкрайно ясна (т.е. определя 
> >>дали променливата ще участва инкрементирана в израза, като тя самата при 
> >>всички случаи се инкрементира), но защо  когато участва и в лявата страна 
> >>на израза (втория случай) се получава един инкремент повече...
> >>   
> >>
> >....
> >
> >Нали знаеш вица "Докторе, като правя така, ме боли" "Ами не прави
> >така" :) ...Смесването на префиксния и постфиксния оператор в/у една и
> >съща променлива в един израз не е ясно какво дава, както например не е
> >ясно какво прави
> >a+++b (т.е. дали е (a++) +b  или a+(++b) ). 
> > 
> >
> Ами пак без да се заяждам, по принцип ++ е с по-голям приоритет от +, а 
> и изразите се разчитат от дясно наляво, което би следвало че ще е втория 
> вариант, демек a+(++b).
> 
> Така би трябвало да е ( е поне според мен, и според това както са ме учили )

Хмм.. тук вече зависи :)

Според стандартите за езика C наистина ++ има по-висок приоритет пред +,
само че това с разчитането на изразите отдясно наляво не съм сигурен, че
е стандартизирано наистина.  Част от проблема е, че според таблицата с
приоритетите '++' се асоциира отдясно наляво, а '+' - отляво надясно,
макар че това всъщност няма голямо значение за това точно как ще бъде
разчетен (parsed) изразът.

Въпросът наистина е в самото разчитане (parsing), и там вече нещата много
зависят от това точно какъв компилатор се използва май :)  В момента нямам
подръка копие на K&R, за да проверя дали те са дали BNF за синтаксиса, а по
кажи-речи понятни, донякъде финансови, причини нямам подръка и ANSI X3J11,
за да видя дали пък *те* не са дали BNF за синтаксиса.  Единственото, което
имам, е компилатор, и то само GNU C 2.95.4 и 3.4.2 във FreeBSD вариантите.

[EMAIL PROTECTED] ~/c/misc/foo]> ./prec
(a++) + b = 6
a + (++b) = 7
a+++b = 6
[EMAIL PROTECTED] ~/c/misc/foo]>

Това е резултат от изпълнението на следната програма:

#include <stdio.h>

int main(void)
{
        int a, b, c;

        a = 1; b = 5;
        c = (a++) + b;
        printf("(a++) + b = %d\n", c);

        a = 1; b = 5;
        c = a + (++b);
        printf("a + (++b) = %d\n", c);

        a = 1; b = 5;
        c = a+++b;
        printf("a+++b = %d\n", c);

        return (0);
}

Явно поне при GCC се използва parser, който се опитва първо да навлезе в
дълбочина, т.е. да намери най-дългото възможно съвпадение с валиден терм,
така че поредицата от плюсове в 'a+++b' бива разбита първо на '++', защото
е по-дълго.

Ще се поровя да видя дали не мога да намеря някъде някакъв истински
стандарт, който да дефинира това поведение, или пък ще си остане undefined
behavior.

Поздрави,
Петър

-- 
Peter Pentchev  [EMAIL PROTECTED]    [EMAIL PROTECTED]    [EMAIL PROTECTED]
PGP key:        http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint FDBA FD79 C26F 3C51 C95E  DF9E ED18 B68D 1619 4553
If you think this sentence is confusing, then change one pig.

Attachment: pgphG0zyQhkde.pgp
Description: PGP signature

Reply via email to