|
Re: lug-bg: c/cpp incr/decr
- Subject: Re: lug-bg: c/cpp incr/decr
- From: Zhasmin Zhelev <z@xxxxxxxxxxx>
- Date: Tue, 18 Jan 2005 11:26:11 +0200
George Danchev wrote:
On Tuesday 18 January 2005 09:24, Nikolay Mitev wrote:
Така това Хубаво, но след като всичко е синтактично правилно защо компила с
-Wall не предупреждава за potential undefined behaviour след като го карам
една и съща променлива да участва в израза хем преди инкремента и
едновременно с това хем след инкремента без да имаме валиден край за
statement (;) между тях (sequence poin) ? Това е извадка от по-сложна
програма където нещата не са така явни и не е лесно да се track down-не, но
се свежда до един такъв подводен камък. (операторите са други разбира се,
щото инкремент + декремент няма много смисъл разбира се ;-)
Не искам да задълбавам много, но по-принцип, в горния пример според
мисленето и смятането на компилатора (или поне както аз си го преставям)
всичко е вярно. Изразите имат някакав приоритет на изпълнение и се
преобразуват в обратен полски запис и се изчисляват спрямо него. И ето
за конкретните примери:
1. a = x++ + ++x;
това се свежда до:
(++х) х=1
(х++) х=1 (тук не се извършва увеличаването)
събират се двете и се получава за "а" се получава 2, а след операцията "х" нараства с 1 и става 2
2. x = x++ + ++x;
аналогично на горния пример след операцията х = 2 но допълнитеното (х++)
го прави 3.
Не е толкова сложно, но ужасно неразбрано и предпоставка за много грешки.
със Здраве.
============================================================================
A mail-list of Linux Users Group - Bulgaria (bulgarian linuxers).
http://www.linux-bulgaria.org - Hosted by Internet Group Ltd. - Stara Zagora
To unsubscribe: http://www.linux-bulgaria.org/public/mail_list.html
============================================================================
|
|
|