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

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

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

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

Q&A

解決済

2回答

4153閲覧

C++の同じアドレスのところを出力しているはずなのに違う値が出るのですが・・・

nekokaido

総合スコア28

C++

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

0グッド

0クリップ

投稿2017/06/07 12:15

###前提・実現したいこと
現在C++の入門書で学習しているずぶの素人です。一つのアドレスを複数のポインタで指しているんですけど、いざ入ってる値を出力してみると違う値が出ます。とりあえずソースコードと出力結果を見てみてください。
何故このような出力結果が出るのか知りたいだけです。
気軽に解答してください(´・ω・`)

###該当のソースコード

C++

1#include "iostream" 2 3int main(int argc, char const *argv[]) { 4 const int a = 1; 5 const int *p = &a; 6 int *pp = const_cast<int *>(p); 7 *pp = 2; 8 std::cout << "&a = " << &a << '\n'; 9 std::cout << "p = " << p << '\n'; 10 std::cout << "pp = " << pp << '\n'; 11 std::cout << "a = " << a << '\n'; 12 std::cout << "*p = " << *p << '\n'; 13 std::cout << "*pp = " << *pp << '\n'; 14 return 0; 15}

###出力結果
&a = 0x7ffd839e1064
p = 0x7ffd839e1064
pp = 0x7ffd839e1064 //同じアドレスを指しているはず・・・
a = 1 //constのせいで頑なに変わろうとしないのか?
*p = 2
*pp = 2

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

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

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

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

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

guest

回答2

0

const がついているオブジェクトを変更しようとすると未定義の動作が発生します。 つまり、何がおきるかわかりません。 何の保証もありません。

コンパイラは場合によっては不変性を最適化のヒントとして利用します。 変更されることはないという前提の下にレジスタ上に残っている値を使いまわしたり、あるいは (実際にはメモリにアクセスせずに) 定数として埋め込んだりといったこともやります。 なので、未定義といっても古い値が現れることは多いようです。

投稿2017/06/07 12:55

SaitoAtsushi

総合スコア5444

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

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

nekokaido

2017/06/07 23:20

本当は別のところから値を持ってきてるってことですかね。constの使用は注意が必要ですね・・・
guest

0

ベストアンサー

a = 1 //constのせいで頑なに変わろうとしないのか?

コンパイラやオプションによって変わると思いますが、
Visual Studio 2017 x86 Releaseビルドでは
変数aを引数に設定する部分が、push 1 のように直接1が設定されています。

std::cout << "a = " << a << '\n'; 00BA1089 push 1 00BA108B push ecx 00BA108C mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0BA3054h)] 00BA1092 mov edx,offset string "a = " (0BA3140h) 00BA1097 call std::operator<<<std::char_traits<char> > (0BA11D0h) 00BA109C add esp,4 00BA109F mov ecx,eax 00BA10A1 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0BA3038h)] 00BA10A7 mov ecx,eax 00BA10A9 call std::operator<<<std::char_traits<char> > (0BA1400h)

constの変数は書き換えないのがルールだから、1だとわかっている変数aのアドレスから
値を取得してくる必要はありません。ですので、

std::cout << "a = " << 1 << '\n';

と最適化したということだと思います。

投稿2017/06/07 15:10

hmmm

総合スコア818

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

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

nekokaido

2017/06/07 23:23

最適化ですかー、そんなことがあるんですね。詳しい解答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問