59

重複の可能性:
C で a+++++b が機能しないのはなぜですか?

これは、David Simon の「An Embedded Software Primer」の 113 ページから入手しました。

以下の発言を見ました。

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

この行に 3 つのマイナス記号を含めることができますか? トリプルマイナス記号は何を意味しますか.

私はそれがCプログラミングステートメントだと信じています。

4

5 に答える 5

49

正解は(ロブが言ったように)次のとおりです。

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

そうである理由とそうでない理由

iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);

これは、次のトークンに複数の可能性がある場合、最も多くの文字を含むものを使用 (噛む) という、最大ムンク戦略として知られる規則です。この場合の可能性は---であり、--明らかに長いです。

于 2012-12-14T07:22:48.113 に答える
12

Draft C++11 (PDF) 2.5 Preprocessing tokens、clause 3 およびDraft C11 (PDF) 6.4 Lexical elements、clause 4 に従って、コンパイラーは可能な限り最長の文字シーケンスを次のトークンとして解析します。

これは---、 と の 2 つのトークンに解析されることを--意味-します。

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

これは、優先順位や解析規則が不明な場合は、括弧を使用してコードを明確にすることも示しています。

于 2012-12-14T07:11:02.950 に答える
5

に等しい

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 を返します。

于 2012-12-14T07:07:54.030 に答える
-9

もちろん。この文

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

と同等です

iHoursTemp = iHoursTemp + iZoneNew -(--iZoneOld); //first decrement iZoneOld then perform rest of the arithmetic operation.

ちょっとした頭の体操ですが、書くのは楽しいです :-)

于 2012-12-14T12:51:16.603 に答える