2016-07-06 16 views
-3

私はCプログラミング言語IIを読んでいます。演算子優先順位表では、キャスト演算子を(type)と表示しています。C:()または(int)のキャスト演算子?

だけ()機能のオペレータのようなキャスト演算子であるか、それが(int)のような全体としてのタイプを含む、(float) ...?

もしそうなら、私は新しい演算子を自分でtypedefと宣言できますか?

答えて

4

タイプキャストはtypeintまたはchar *またはtypedefを通じて作成タイプエイリアスのようなネイティブ型のいずれかである(type)、を介して行われます。

ファンクションコールは()演算子で行われます。

これらは類似しているかもしれませんが、非常に異なっており、もちろん別の場所に配置されています。たとえば、(type) expressionは型キャストで、expression()は関数呼び出しです。もちろん、キャスト演算子と(type) expression()のような呼び出し演算子を組み合わせることができます。つまり、関数を呼び出して、関数の戻り値をにキャストします。

最後のキャストと呼び出し式が混乱しているのは、関数呼び出しがキャストよりも高いoperator precedenceであるためです。呼び出しが最初に行われるためです。

+0

は "()" 右、キャスト演算子ですか? –

+1

@Best_Nameいいえ、 '()'は関数呼び出し式で、 '(type)'はキャストです。 '()expression'を書くだけでは無効です。コンパイラエラーが発生します。 –

+0

so(int)、(float)、(sometypeidefined)は演算子ですか? –

0

()、その前に、関数名との組み合わせでのみ有効である(あなたはパラメータなしで関数を呼び出す意味空1、)関数呼び出し式です

このように:

#include <stdio.h> 

int main(void) 
{ 
int bar = foo(); // foo is called with no parameters 
printf("bar:%d",bar); 
return 0; 
} 

int foo(void) { 
return 3; 
} 
しかし、これでは、例えば同様に、(天然型または1のいずれかが typedefを介して定義された)ブラケットの内部型の式を使用して行われ

キャスティング:

#include <stdio.h> 

int main(void) { 
int foo = (int) 19.21; 
printf("foo = %d", foo); // Will print 19 because 19.21 (double literal) was cast to int 
return 0; 
} 
+0

"()は、その前の関数名との組み合わせでのみ有効です。isは関数呼び出し式ですつまり、パラメータなしで関数を呼び出すことを意味します) "その他の用途:' inf foo2(); 'は、そのパラメータに関する情報を持たない関数を宣言します。 '()'は関数ポインタへのキャストにも使われます。 '(int(*)())'。変数宣言 'int * z()'もあります。ここでzは関数ではなく、[関数ポインタ]です(http://cdecl.ridiculousfish.com/?q=int+*z%28%29)。 – chux

1

Cはここで少し混乱します。同じ構文を使用しますが、コンテキストによって異なる意味を持つ演算子がいくつか存在するためです。事態をさらに悪化させるために、同じ構文を演算子でもないものに使用することができます。これは、C言語のすべてで使用されている()の場合に特に当てはまります。

  • 括弧で囲まれた式:

    ()は、次のいずれかを意味するかもしれません。これはいわゆるプライマリ式です。これは、すべての演算子より優先される基本的なもののための派手な言葉です。

  • キャスト演算子。すべての型に対してキャスト演算子は1つのみです。 Cで演算子の意味を再定義することはできません(ただし、C++では演算子のオーバーロードによって可能です)。
  • 関数呼び出し演算子。
  • 複合リテラル宣言の一部です。
  • それは、文、関数宣言、関数のようなマクロ宣言/呼び出し、特定の変数宣言の一部などの一部である可能性があります。これは単にコア言語の構文の一部であり、ここやそこに現れます。
+0

"すべてのタイプにキャスト演算子が1つしかありません。"普遍的なキャスト演算子が1つ存在するように聞こえます。 '(int)' '(double)' '(foo_T)'は3つの異なる演算子のように見えます。おそらく、あなたの意図をより明確に表現するための言葉ですか? – chux

1

これは、関数を呼び出して型キャストの関数を宣言するためにも使用されます。
機能例:だから型鋳造で

public void show(){ 
    printf("this is function"); 
} 

...

float a= 1.22; 
in b = (int)a; 
関連する問題