From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8879 invoked from network); 17 Jun 2008 13:20:53 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.4 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 17 Jun 2008 13:20:53 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 27501 invoked from network); 17 Jun 2008 13:20:50 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 17 Jun 2008 13:20:50 -0000 Received: (qmail 17112 invoked by alias); 17 Jun 2008 13:20:47 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 25191 Received: (qmail 17086 invoked from network); 17 Jun 2008 13:20:46 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 17 Jun 2008 13:20:46 -0000 Received: from mail.o2.co.uk (yoda.london.02.net [82.132.130.151]) by bifrost.dotsrc.org (Postfix) with ESMTP id 4EA2E8028AC3 for ; Tue, 17 Jun 2008 15:20:40 +0200 (CEST) Received: from sc.homeunix.net (78.105.216.138) by mail.o2.co.uk (8.0.013.3) (authenticated as stephane.chazelas) id 4851DD9500C83E45; Tue, 17 Jun 2008 14:20:39 +0100 Received: from chazelas by sc.homeunix.net with local (Exim 4.69) (envelope-from ) id 1K8b71-0002Ho-FU; Tue, 17 Jun 2008 14:20:39 +0100 Date: Tue, 17 Jun 2008 14:20:39 +0100 From: Stephane Chazelas To: Zsh hackers list , Richard Hartmann , Peter Stephenson Subject: Re: arithmetic operator precedence Message-ID: <20080617132039.GK5016@sc.homeunix.net> Mail-Followup-To: Zsh hackers list , Richard Hartmann , Peter Stephenson References: <20080612095723.GF5113@sc.homeunix.net> <20080616080726.GP10734@prunille.vinc17.org> <20080616144211.276fb0e3@pws-pc> <2d460de70806170219k12ff4cadn441b52c48bf8076f@mail.gmail.com> <20080617094509.GC5016@sc.homeunix.net> <20080617111934.GE10734@prunille.vinc17.org> <20080617115742.GE5016@sc.homeunix.net> <20080617123551.GJ10734@prunille.vinc17.org> <20080617124607.GH5016@sc.homeunix.net> <20080617130246.GL10734@prunille.vinc17.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20080617130246.GL10734@prunille.vinc17.org> User-Agent: Mutt/1.5.16 (2007-09-19) X-Virus-Scanned: ClamAV 0.92.1/7494/Tue Jun 17 06:46:03 2008 on bifrost X-Virus-Status: Clean On Tue, Jun 17, 2008 at 03:02:46PM +0200, Vincent Lefevre wrote: [...] > It is unspecified. So, the shell is right to choose how it sees it. > > > If $a contains an integer constant such as -3, then as per > > POSIX, $((a * 3)) should be the same as $(($a * 3)), that is > > $((-3 * 3)). > > No, POSIX does not say that. It happens to be the same thing here > just because of the properties of *, but you can't deduce anything > for extensions. It says $((x)) is meant to be the same as $(($x)) which I understand as any occurrance of a variable name (other than $-, $?, $0... obviously) in $((...)) should be the same as if the $ was not ommited (when $x contains an integer constant). That's a recent addition to the text. Only recent versions of ash (BSD shs) support that for instance, which is why it has been recommanded for a while to write it $(($x + 1)) instead of $((x + 1)) in POSIX scripts. And I still use x=$(($x + 1)). For newer ashes, $((x + 1)) is now accepted and note that you do get an error in ash if $x is not an integer constant. > And in practice, shells don't treat $((a * 3)) and > $(($a * 3)) in the same way: > > vin:~> a="1 + 1" > vin:~> echo $((a * 3)) > 6 > vin:~> echo $(($a * 3)) > 4 But here, $a doesn't contain an integer constant, that's out of the scope of POSIX. > > > If we extend that to the non-POSIX **, that would be: > > > > a=-3; $((a ** 2)) should be the same as $((-3 ** 2)). > > No, if we extend POSIX in an intuitive way (see above), $((a ** 2)) > should be the same as $(((-3) ** 2)), hence 9. So, no problem with > $((-3**2)) being -9. [...] No, POSIX does say that $((a ** 2)) is the same as $(($a ** 2)) because $a contains an integer constant, and that's $((-3**2)). -- Stéphane