重複の可能性:
C で a+++++b が機能しないのはなぜですか?
これは、David Simon の「An Embedded Software Primer」の 113 ページから入手しました。
以下の発言を見ました。
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
この行に 3 つのマイナス記号を含めることができますか? トリプルマイナス記号は何を意味しますか.
私はそれがCプログラミングステートメントだと信じています。
重複の可能性:
C で a+++++b が機能しないのはなぜですか?
これは、David Simon の「An Embedded Software Primer」の 113 ページから入手しました。
以下の発言を見ました。
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
この行に 3 つのマイナス記号を含めることができますか? トリプルマイナス記号は何を意味しますか.
私はそれがCプログラミングステートメントだと信じています。
正解は(ロブが言ったように)次のとおりです。
iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
そうである理由とそうでない理由
iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);
これは、次のトークンに複数の可能性がある場合、最も多くの文字を含むものを使用 (噛む) という、最大ムンク戦略として知られる規則です。この場合の可能性は-
と--
であり、--
明らかに長いです。
Draft C++11 (PDF) 2.5 Preprocessing tokens、clause 3 およびDraft C11 (PDF) 6.4 Lexical elements、clause 4 に従って、コンパイラーは可能な限り最長の文字シーケンスを次のトークンとして解析します。
これは---
、 と の 2 つのトークンに解析されることを--
意味-
します。
iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
これは、優先順位や解析規則が不明な場合は、括弧を使用してコードを明確にすることも示しています。
に等しい
iHoursTemp = iHoursTemp + (iZoneNew--) -iZoneOld;
#include <stdio.h>
int main()
{
int iHoursTemp = 2, iZoneOld = 3, iZoneNew = 4;
//2+4 - 2 = 4
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
//2+(4--) -3 = 3
printf("\n :%d \n", iHoursTemp);
return 0;
}
gcc で 3 を返します。
もちろん。この文
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
と同等です
iHoursTemp = iHoursTemp + iZoneNew -(--iZoneOld); //first decrement iZoneOld then perform rest of the arithmetic operation.
ちょっとした頭の体操ですが、書くのは楽しいです :-)