
c
1/* long に限らず! */ 2 3long int longintchan = 1234567890L; /* Lは必要? */ 4long longintchan = 1234567890L; 5
型名を省略した場合、内部での処理は型名をちゃんと指定した場合と、何か異なるのですか?
省略したときと、しなかったときの利点、欠点はなんですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサーが出ていますが、なんかちょっと違うと思ったので。
long int
はlong
の別表記であって、全く同じです。コンパイラは全く同じ物として扱います。他にもsigned long
やsigned long int
も別表記であって、全く同じです。これはintやsignedが省略されているとか、省略できるというものでは決してありません。singnedやintは型の一部であり、切り離すことはできません。たとえば、char
とsigned char
は厳密に区別されます。また、型を省略した場合、intと見なすという暗黙のintというルールがかつてありましたが、C11では削除されています。
次にL
ですが、この場合は付けなくてもかまいません。なぜなら、C言語ではint
に収まらない10進数の整数リテラルはlong
またはlong long
に勝手に昇格します。たとえ、int
のままであっても、int
からlong
へ絶対に失敗しないキャストが行われるため、影響はありません。ただし、8進数整数リテラルと16進数整数リテラルはunsignedを挟んで昇格するなど、注意点が多いため、L
を付けておいた方がいいと思います。
※ long
になるかlong long
になるかはそれぞれのサイズがint
と比べてどれだけ大きいかになるため、処理系によります。
投稿2016/04/24 15:20
総合スコア21741
0
こんにちは。
型名を省略した場合、内部での処理は型名をちゃんと指定した場合と、何か異なるのですか?
変わらないです。コンパイラは省略していない型で認識してます。
省略したときと、しなかったときの利点、欠点はなんですか?
省略したら、ソースがちょっとだけ短くなることですね。意味なく長いと見にくくなることが多いので私はほぼ常に省略してます。
数値リテラルの最後の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 13:40
編集2016/04/25 01:47総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。


0
ベストアンサー
省略しても構文が変わらない限り、int は省略可能です。同じ意味です。
C
1static x; /* static int x; の意味 */
とか。また、警告は出ると思いますが、関数の外のグローバル変数の場合、
C
1x; /* int x; の意味 */
と書けます。
書けるだけであって、普通はそう書かないでしょう。
投稿2016/04/24 13:36
総合スコア86281
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/04/24 14:03

0
全く同じです。違いはありません。強いて言えば「めんどくささ」でしょうか。
--追記
考えてみれば私もunsigned
はunsigned int
とintを略さないタイプですので、人により好みで、あるいはルールがあればルールに従う、で良いのかなと思います。
といってもlong
で済むところをauto signed long int
と書かれていると、人によっては違和感を感じるかもしれません(例えば私)。
投稿2016/04/24 13:28
編集2016/04/24 13:43総合スコア1151
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/04/24 14:06

0
C++も同じっぽいです。(膨大な仕様書までは確認できてませんけど…)
http://en.cppreference.com/w/cpp/language/integer_literal#The_type_of_the_literal
あ、コメントに書く内容を回答にかいちゃった。削除依頼って出せるっけかな。
投稿2016/04/24 21:58
編集2016/04/24 22:00総合スコア21741
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/24 15:54
2016/04/24 16:32
2016/04/24 21:58
2016/04/24 22:15
2016/04/25 00:57
退会済みユーザー
2016/04/25 04:53 編集