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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

5274閲覧

C++:ローカル変数のcharの初期値

luma

総合スコア183

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/26 10:22

お世話になってます

C++のローカル変数は初期化しなければ不定と言われていますが、
あるコードで、冒頭で宣言していて、実行するといつも0になります。
初期化すればいい話ですが、ショートコーディングで使えないかと思いました。

例えば

cpp

1#include <iostream> 2using namespace std; 3 4int main() 5{ 6 char a,b; 7 cout << (int)a << endl; 8 cout << (int)b << endl; 9}

a,bはともに0('\0')でした

幾つか仮説を考えてみました

  1. やはり偶然で、コード、コンパイル以外に依存する
  2. 冒頭char宣言は、何かしら条件はあるが0固定で、その条件をたまたま満たしている

たとえばグローバルに関数を一切書かないとか
3. コードから推測はできないという意味で不定だが、同じコードであれば一定
4. コンパイラ、もしくはオプションがなんかしている

1以外なのかもしれないと思い、質問をさせていだだきました

コンパイルは、
EclipseでMacOS標準のものを使うよう設定したもの
clang++ main.cpp -g -O0 -m32
などです

一定だと考えて大丈夫でしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

言語で定義されないものは環境依存です。
要は、コンパイラーやOS、環境変数などによって値が異なるかもしれないということです。

テスト用でWindowsPCで動作したものが大型コンピュータに持っていったら動作しない。
コンパイルさえ通らないということです。

あなたが作り、あなたしか使わないプログラムでさえ、Windows8.1をWindows10にし、
Windows10が新バージョンになり、コンパイラーが変わると動作しないものが現れます。

初期のCで言いますと、intは16bitか32bitとなっています。
コンパイラーを作る人やコンピュータの都合の良い方で作っていいという仕様です。
自由とは少し違います。そのほうがコンピュータに合っていて早く動作する方を選べるということですね。

最古のCOBOLでも数字型は10進数で持っていますが、処理を早くするためにCOMPという指定があります。
普通コンピュータは2進数で動きますのでこれも2進数なのですが、
OS400というOSは2進数より16進数のほうが速いというものでしたのでこの値も16進数でした。

投稿2017/07/26 11:25

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luma

2017/07/26 11:35

環境依存であれば厳密に再現できてさえ違う結果になるかもしれないですね 言語で未定義、という扱いなんですね、勉強になりました
guest

0

ベストアンサー

ショートコーディングで使えないかと思いました。

それなら、関数外で宣言してください。静的変数の初期値は0になることが保証されています。

投稿2017/07/26 10:37

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

luma

2017/07/26 10:49

解答ありがとうございます main関数内で宣言したい理由として 数字が使えない制限がある問題で、 int main(int x){ char a=(xをつかう),b=(a,xをつかう),c=x-x; } このxが実行方法によってx=1と保証されているので、 それを利用し、代入宣言をすることで短くしようと思いました char c;だけ外に出してもちょうど1byte長くなってしまい、 そして、=x-xを省けるなら、とおもいました
maisumakun

2017/07/26 11:01

不定の状態にある変数を参照した場合、動作は未定義となります。あなたのマシンで特定の動きをしたとしても、他のマシンに持っていった場合にはコンパイル可能なことすら保証されません。 判定システムのあるショートコーディングであれば、「判定システムの環境」に合わせて調整が必要となります。
luma

2017/07/26 11:28

ありがとうございます なにかしら規則的であるのかと思いましたが、 未定義なら使わないに越したことはなさそうですね
majiponi

2017/07/27 03:08

xがゼロにならないなら、!xとしてみては? 1バイト削れますよ
luma

2017/08/01 11:03

素晴らしい????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問