IF Statement Notation

Mar 20, 2014 9 Replies

Anyone know how to interpret this IF (I think) statement...



PMI=(PM>=0)?((PM==0)?1000:PM):PMC



it's in a notation-style I don't understand.



Thanks! ...Jim Thompson



-- | James E.Thompson | mens | | Analog Innovations | et | | Analog/Mixed-Signal ASIC's and Discrete Systems | manus | | San Tan Valley, AZ 85142 Skype: Contacts Only | | | Voice:(480)460-2350 Fax: Available upon request | Brass Rat | | E-mail Icon at

formatting link
| 1962 | I love to cook with wine. Sometimes I even put it in the food.


It looks like C-style conditional operator (whose use is frowned upon, particularly in cascade like that).

In C and C++,

ANSWER = THING ? THIS : THAT;

means that if THING is true, ANSWER = THIS. Of THING is false, ANSWER = THAT.

In more traditional if-else notation, your statement expands to:

if (PM >= 0) { if (PM == 0) { PMI = 1000; } else { PMI = PM; } } else { PMI = PMC; }

Which packs much less confusion per line, and is therefor much less desirable from a geeky programmer point of view.

Those limp-wristed busybodies at MISRA have ruled out its use in mission- critical software, if you can imagine that.

Tim Wescott Wescott Design Services http://www.wescottdesign.com

In English, does this mean:

If PM is exactly 0, PMI=1000 If PM is greater than 0, PMI=PM Otherwise (negative PM?) PMI=PMC

I'm confused by the stacking :-(

Thanks, Tim! C-notation fits... this is from an HSpice device library. ...Jim Thompson

| James E.Thompson | mens | | Analog Innovations | et | | Analog/Mixed-Signal ASIC's and Discrete Systems | manus | | San Tan Valley, AZ 85142 Skype: Contacts Only | | | Voice:(480)460-2350 Fax: Available upon request | Brass Rat | | E-mail Icon at http://www.analog-innovations.com | 1962 | I love to cook with wine. Sometimes I even put it in the food.

Oh gosh, why should something so clear be confusing? ;)

Yes, that's what it means (which is what JM said).

Tim Wescott Wescott Design Services http://www.wescottdesign.com

And, a more natural way would be not to have tests for overlapping cases:

if (PM > 0) { PMI = PM; } else if (PM == 0) { PMI = 1000; } else { PMI = PMC; }

Which translates back to:

PMI = (PM > 0) ? PMI = PM : (PM == 0) ? 1000 : PMC;

The funny thing about that logical test... all that BS was simply to SQUAWK if you set the device width less than 420nm (the minimum allowed). No subcircuit function whatsoever. So, since I was converting it to PSpice, I just tossed it ;-) ...Jim Thompson

| James E.Thompson | mens | | Analog Innovations | et | | Analog/Mixed-Signal ASIC's and Discrete Systems | manus | | San Tan Valley, AZ 85142 Skype: Contacts Only | | | Voice:(480)460-2350 Fax: Available upon request | Brass Rat | | E-mail Icon at http://www.analog-innovations.com | 1962 | I love to cook with wine. Sometimes I even put it in the food.

Looks terribly wordy in any of these forms. I still remember fondly the arithmetic IF of old FORTRAN

IF(PM) 100,200,300

100 PMI=PMC; GO TO 400 200 PMI = 1000; GO TO 400 300 PMI = PM 400 CONTINUE

Ha, line numbers!

I remember long ago, basic was a real crutch due to the lack of line renumbering function, when that came along it was like driving a caddidlyac.

Jamie

Although to some extent it would be more readable for a non-programmer by rewriting it in order of ascending value of PM namely

if (PM

if (PM=0) doit // which never works

is not allowed in MISRA C:2012, Rule 13.4 "The result of an assignment operator should not be used"

The Keil ARM C compiler always whinges about 'if (assignment)' with a helpful "did you really mean that" kind of warning.

Michael Kellett

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required