Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

Re: lug-bg: c/cpp incr/decr


  • Subject: Re: lug-bg: c/cpp incr/decr
  • From: Peter Pentchev <roam@xxxxxxxxxxx>
  • Date: Tue, 18 Jan 2005 12:23:13 +0200

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 вариантите.

[roam@straylight ~/c/misc/foo]> ./prec
(a++) + b = 6
a + (++b) = 7
a+++b = 6
[roam@straylight ~/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	roam@xxxxxxxxxxx    roam@xxxxxxxx    roam@xxxxxxxxxxx
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: pgpkdCnlx2_FB.pgp
Description: PGP signature



 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.