Cでは、次のように書くことは合法です。
int foo = +4;
ただし、私が知る限り、の単項プラス(+
)+4
はノーオペレーションです。それは...ですか?
Cでは、次のように書くことは合法です。
int foo = +4;
ただし、私が知る限り、の単項プラス(+
)+4
はノーオペレーションです。それは...ですか?
式が算術型であるという一種のアサーションとして使用できます。
#define CHECK_ARITHMETIC(x) (+(x))
x
これは、(たとえば)ポインタと評価された場合にコンパイル時エラーを生成します。
それが私が考えることができる唯一の実用的な使用法です。
6.3.3.3のC90標準によると:
単項+演算子の結果は、 そのオペランドの値です。汎整数拡張は、オペランドに対して実行されます。結果はプロモートタイプになります。
と
単項+または-演算子のオペランドは、算術型..で なければなりません 。
私が知っている単項プラス演算子の非常に便利な使用法が1つあります。それはマクロです。次のようなことをしたいとします
#if FOO > 0
が未定義の場合FOO
、この場合、C言語では0に置き換える必要があります。ただしFOO
、空の定義で定義されている場合、上記のディレクティブはエラーになります。代わりに、次を使用できます。
#if FOO+0 > 0
そして今、ディレクティブは、FOO
未定義、空白として定義、または整数値として定義されているかどうかにかかわらず、構文的に正しくなります。
もちろん、これが目的のセマンティクスを生成するかどうかは完全に別の質問ですが、いくつかの有用なケースではそれが生成されます。
編集:次のように、これを使用して、ゼロとして定義されている場合と空白として定義されている場合を区別することもできます。FOO
#if 2*FOO+1 == 1
/* FOO is 0 */
#else
/* FOO is blank */
#endif
かなり。これは主に完全性のために存在し、このような構造を少しきれいに見せるために存在します。
int arr[] = {
+4,
-1,
+1,
-4,
};
単項演算+
子が行うことは2つあります
integer promotion
turning lvalue into rvalue
整数拡張の例:
#include <stdio.h>
int main(void) {
char ch;
short sh;
int i;
long l;
printf("%d %d %d %d\n",sizeof(ch),sizeof(sh),sizeof(i),sizeof(l));
printf("%d %d %d %d\n",sizeof(+ch),sizeof(+sh),sizeof(+i),sizeof(+l));
return 0;
}
一般的な出力(64ビットプラットフォーム):
1 2 4 8
4 4 4 8
左辺値を右辺値の例に変換する:
int i=0,j;
j=(+i)++; // error lvalue required
単項演算子は、整数拡張を適用するという+
1つのことだけを行います。オペランドが式で使用された場合、これらはとにかく発生するため、単項は単項との対称性のためにCにあると想像できます。+
-
プロモーションは非常に一般的に適用されているため、これが実際に動作していることを確認するのは困難です。
私はこれを思いついた:
printf("%zd\n", sizeof( (char) 'x'));
printf("%zd\n", sizeof(+(char) 'x'));
これは(私のMacでは)印刷されます
1
4
Cの単項'+'演算子の目的は何ですか?
単項プラスは、国際標準の理論的根拠-プログラミング言語-Cから、単項マイナスとの対称性のためにCに追加されました。
単項プラスは、単項マイナスとの対称性のために、いくつかの実装からC89委員会によって採用されました。
ノーオペレーションではなく、オペランドに対して整数拡張を実行します。単項+演算子は型変換を行いますか?への私の答えから引用します。:
ドラフトC99標準セクション6.5.3.3
単項算術演算子は次のように述べています。
単項+演算子の結果は、その(プロモートされた)オペランドの値です。整数拡張はオペランドで実行され、結果はプロモートされたタイプになります。
Annotated C ++リファレンスマニュアル(ARM)は、単項プラスについて次の解説を提供していることを指摘する価値があります。
単項プラスは歴史的な事故であり、一般的に役に立たない。
「no-op」とは、組み立て手順を意味しますか?
もしそうなら、間違いなくそうではありません。
+4はちょうど4です-コンパイラはそれ以上の命令を追加しません。