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
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 |
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
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 |
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
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 |
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
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.