IF Statement Notation

Mar 20, 2014 6 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;

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