質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C

    3830questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

long int と long の処理の違いは?!?!?!??!

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,256
退会済みユーザー

退会済みユーザー

/* long に限らず! */

long int longintchan = 1234567890L;    /* Lは必要? */
long longintchan = 1234567890L;


型名を省略した場合、内部での処理は型名をちゃんと指定した場合と、何か異なるのですか?
省略したときと、しなかったときの利点、欠点はなんですか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+2

省略しても構文が変わらない限り、int は省略可能です。同じ意味です。

static x; /* static int x; の意味 */


とか。また、警告は出ると思いますが、関数の外のグローバル変数の場合、

x; /* int x; の意味 */


と書けます。
書けるだけであって、普通はそう書かないでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/24 23:03

    ありがとうございます!!
    x;
    と書けることが知れて本当によかったです。
    勉強になりました!!!
    ありがとうございます!!!

    キャンセル

+2

全く同じです。違いはありません。強いて言えば「めんどくささ」でしょうか。

--追記
考えてみれば私もunsignedunsigned intとintを略さないタイプですので、人により好みで、あるいはルールがあればルールに従う、で良いのかなと思います。

といってもlongで済むところをauto signed long intと書かれていると、人によっては違和感を感じるかもしれません(例えば私)。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/24 23:06

    ありがとうございます!!
    読みやすさを考えたらいいのですね😁

    キャンセル

+2

こんにちは。

型名を省略した場合、内部での処理は型名をちゃんと指定した場合と、何か異なるのですか? 

変わらないです。コンパイラは省略していない型で認識してます。

省略したときと、しなかったときの利点、欠点はなんですか?

省略したら、ソースがちょっとだけ短くなることですね。意味なく長いと見にくくなることが多いので私はほぼ常に省略してます。

数値リテラルの最後のLはlong型のリテラルであることを示します。
intで表現できずlongで表現できるような数値リテラルを書きたい時は省略してはいけません。
int型で表現できる時は省略しても実害が発生するケースはあまり無いだろうと思います。
(負の数を正の値で記述するなどのちょっと無理やりなことをしないかぎり。)


Lの必要性に関して訂正】

intで表現できずlongで表現できるような数値リテラルを書きたい時は省略してはいけません。

「省略してはいけません。」ということはないようです。
raccyさんの回答を見ていただくのが早いですが、数値リテラルは自動的に昇格されます。

しかし、raccyさんも書かれているように、unsignedがらみで落とし穴があります。
きじねこ「第5回 int 型のサイズ」が分かりやすく解説してました。)

恐らく、便利のための機能ではなくマルチ・プラットフォーム対応のための機能ではないかと思います。
処理系によってintやlongのサイズは異なりますので、数値リテラルがlongになるかどうかは処理系依存です。従って、マルチ・プラットフォーム対応する時に適切につけることは難易度高いです。

マルチ・プラットフォーム対応しないなら、明示的に指定しておいた方が落とし穴にはまる心配をしなくてよさそうです。
マルチ・プラットフォーム対応する時は、下手に指定できないため、注意深く落とし穴を避けるしかなさそうです。
たぶん、処理系によって型が異なるような大きな数値リテラルをなるべく使わないことですね。
各型で表現できる最大/最小は<limits.h>(C言語)や<limits>(C++言語)に定義されてます。
1パイトが8ビット以上は保証されてますので、1バイトで表現できる値(±127まで)は安全ですね。
実際にint型が1バイトな処理系はほとんど無い(もしかすると規格で禁止?)でしょうから、±32767までは事実上安全でしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/24 23:06

    ありがとうございます!
    ちゃんと考えて省略しないと読みづらくなるのですね >_<

    キャンセル

+2

ベストアンサーが出ていますが、なんかちょっと違うと思ったので。

long intlong別表記であって、全く同じです。コンパイラは全く同じ物として扱います。他にもsigned longsigned long int別表記であって、全く同じです。これはintやsignedが省略されているとか、省略できるというものでは決してありません。singnedやintは型の一部であり、切り離すことはできません。たとえば、charsigned charは厳密に区別されます。また、型を省略した場合、intと見なすという暗黙のintというルールがかつてありましたが、C11では削除されています

次にLですが、この場合は付けなくてもかまいません。なぜなら、C言語ではintに収まらない10進数の整数リテラルはlongまたはlong long勝手に昇格します。たとえ、intのままであっても、intからlongへ絶対に失敗しないキャストが行われるため、影響はありません。ただし、8進数整数リテラルと16進数整数リテラルはunsignedを挟んで昇格するなど、注意点が多いため、Lを付けておいた方がいいと思います。
※ longになるかlong longになるかはそれぞれのサイズがintと比べてどれだけ大きいかになるため、処理系によります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/25 00:54

    > C言語ではintに収まらない10進数の整数リテラルはlongまたはlong longに勝手に昇格します。

    おお、そうなのですか!! 情報ありがとうございます。

    ところで、C++言語ではどうなります? 同じなら問題ないですが、もし、異なるなら把握しとかないと嵌りそうな知識なので。

    キャンセル

  • 2016/04/25 01:32

    確かに。回答で例に挙げた static x; だとか、戻り値の型を書かない関数定義だと、intが省略されていると思いますが、long x; もそれと同様というトーンで回答したのはまずかった気がします。

    キャンセル

  • 2016/04/25 06:58

    C++も同じっぽいです。(膨大な仕様書までは確認できてませんけど…)
    http://en.cppreference.com/w/cpp/language/integer_literal#The_type_of_the_literal

    キャンセル

  • 2016/04/25 07:15

    もうひとつ、Cでは一つの塊扱いですが、C++ではsignedやlongはModifier扱いなので順番を入れ替えられてもいいようです。
    http://en.cppreference.com/w/cpp/language/types#Modifiers
    http://en.cppreference.com/w/c/language/arithmetic_types#Integer_types
    gccだとCでも順番入れ替えても警告無しでコンパイルは通るんですけどね。

    はぁ、回答に書くというすんごいミスするし、もうだめぽ。

    キャンセル

  • 2016/04/25 09:57

    raccyさん。

    ありがとうございます。C++でも同じように定義されているのですね。

    キャンセル

  • 2016/04/25 13:53 編集

    ありがとうございます!!
    暗黙の型変換がC11で消されたというのは初耳でした!!!
    勉強になりました😭

    キャンセル

0

C++も同じっぽいです。(膨大な仕様書までは確認できてませんけど…)
http://en.cppreference.com/w/cpp/language/integer_literal#The_type_of_the_literal


あ、コメントに書く内容を回答にかいちゃった。削除依頼って出せるっけかな。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3830questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。