f(i = -1、i = -1)が未定義の動作であるのはなぜですか?

269
Nicu Stiurca 2014-02-10 20:31.

私は評価違反の順序について読んでいました、そしてそれらは私を困惑させる例を与えます。

1)スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用と比較して順序付けされていない場合、動作は定義されていません。

// snip
f(i = -1, i = -1); // undefined behavior

このコンテキストでiは、はスカラーオブジェクトであり、これは明らかに

算術型(3.9.1)、列挙型、ポインター型、メンバー型へのポインター(3.9.2)、std :: nullptr_t、およびこれらの型のcv修飾バージョン(3.9.3)は、まとめてスカラー型と呼ばれます。

その場合、ステートメントがどのように曖昧であるかはわかりません。関係なく、最初または2番目の引数が最初に評価された場合の、ように私には思えるiようになってしまう-1、との両方の引数もあります-1

誰かが明確にできますか?


更新

私は本当にすべての議論に感謝します。これまでのところ、@ harmicの回答は、一見簡単に見えますが、このステートメントを定義する際の落とし穴と複雑さを明らかにしているため、非常に気に入っています。@ acheong87は、参照を使用するときに発生するいくつかの問題を指摘していますが、これはこの質問の順序付けられていない副作用の側面と直交していると思います。


概要

この質問は非常に注目されたので、要点/回答を要約します。まず、「なぜ」は密接に関連しているが微妙に異なる意味、つまり「何のために」、「どのような理由で」、「どのような目的のために」を持ち得るのか、少し余談を述べさせてください。私は、彼らが「なぜ」のそれらの意味のどれに対処したかによって答えをグループ化します。

何のために

主な答えはここから来ているポール・ドレイパーと、マーティン・Jは、広範な答えとしてではないが類似の貢献します。ポール・ドレイパーの答えは要約すると

動作が定義されていないため、未定義の動作です。

答えは、C ++標準が何を言っているかを説明するという点で全体的に非常に良いです。また、f(++i, ++i);やなどのUBのいくつかの関連するケースについても説明しますf(i=1, i=-1);。関連する最初のケースでは、最初の引数をすべきかi+1、2番目の引数をすべきか、i+2またはその逆かは明確ではありません。2番目の例でiは、関数呼び出しの後で1にするか-1にするかが明確ではありません。これらのケースは両方とも、次のルールに該当するためUBです。

スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用と比較して順序付けされていない場合、動作は定義されていません。

したがって、f(i=-1, i=-1)プログラマーの意図が(IMHO)明白で明白であるにもかかわらず、同じルールに該当するため、UBでもあります。

ポール・ドレイパーはまた、彼の結論の中で、

それは定義された振る舞いでしたか?はい。それは定義されましたか?番号。

これは、「どのような理由/目的がf(i=-1, i=-1)未定義の振る舞いとして残されたのか」という疑問に私たちを導きます。

どのような理由/目的のために

C ++標準にはいくつかの見落とし(おそらく不注意)がありますが、多くの省略は十分な理由があり、特定の目的を果たします。多くの場合、目的は「コンパイラー作成者の作業を容易にする」または「コードを高速化する」ことですが 、UBのままにする正当な理由があるかどうかを知ることに主に興味がありましたf(i=-1, i=-1)

有害スーパーキャットは、UBの理由を提供する主な答えを提供します。Harmicは、表面上はアトミックな代入操作を複数のマシン命令に分割する可能性のある最適化コンパイラーと、それらの命令をさらにインターリーブして最適な速度にする可能性があることを指摘しています。これはいくつかの非常に驚くべき結果につながる可能性があります:i彼のシナリオでは-2になります!したがって、harmicは、操作が順序付けられていない場合に、同じ値を変数に複数回割り当てる悪影響が生じる可能性があることを示しています。

supercatは、f(i=-1, i=-1)本来あるべきことを実行しようとする際の落とし穴についての関連する説明を提供します。彼は、一部のアーキテクチャでは、同じメモリアドレスへの複数の同時書き込みに対して厳しい制限があることを指摘しています。より些細なことを扱っていた場合、コンパイラはこれをキャッチするのに苦労する可能性がありf(i=-1, i=-1)ます。

davidfは、harmicの命令と非常によく似たインターリーブ命令の例も提供します。

有害な例、supercatの例、davidfの例はそれぞれ多少工夫されていますが、まとめると、f(i=-1, i=-1)未定義の振る舞いが必要であるという具体的な理由を提供するのに役立ちます。

ポール・ドレイパーの答えが「何のために」の部分をよりよく扱っていたとしても、それが理由のすべての意味に対処するのに最善の仕事をしたので、私はハーミックの答えを受け入れました。

その他の回答

JohnBは、(単なるスカラーではなく)オーバーロードされた代入演算子を検討すると、問題が発生する可能性があると指摘しています。

11 answers

346
harmic 2014-02-10 21:13.

操作は順序付けられていないため、割り当てを実行する命令をインターリーブできないことは言うまでもありません。CPUアーキテクチャによっては、そうすることが最適な場合があります。参照ページには次のように記載されています。

AがBの前にシーケンスされておらず、BがAの前にシーケンスされていない場合、2つの可能性があります。

  • AとBの評価は順序付けられていません。これらは任意の順序で実行でき、重複する可能性があります(単一の実行スレッド内で、コンパイラーはAとBを構成するCPU命令をインターリーブできます)

  • AとBの評価は不確定に順序付けられます。これらは任意の順序で実行できますが、重複することはできません。AがBの前に完了するか、BがAの前に完了するかのいずれかです。次に同じ式が実行されるときは、順序が逆になる場合があります。評価されます。

実行されている操作が値-1をメモリ位置に格納していると仮定すると、それ自体では問題が発生するようには見えません。しかし、コンパイラがそれを同じ効果を持つ別の命令セットに最適化できないことは言うまでもありませんが、操作が同じメモリ位置で別の操作とインターリーブされた場合は失敗する可能性があります。

たとえば、値-1インチをロードするよりも、メモリをゼロにしてからデクリメントする方が効率的であると想像してください。

f(i=-1, i=-1)

次のようになる可能性があります。

clear i
clear i
decr i
decr i

今私は-2です。

おそらく偽の例ですが、可能です。

209
Paul Draper 2014-02-10 20:39.

まず、「スカラーオブジェクトは、」のようなタイプを意味しintfloat(参照、またはポインタをC ++のスカラーオブジェクトとは何ですか?)。


第二に、それはより明白に見えるかもしれません

f(++i, ++i);

未定義の動作があります。だが

f(i = -1, i = -1);

あまり明白ではありません。

少し異なる例:

int i;
f(i = 1, i = -1);
std::cout << i << "\n";

「最後」、、、i = 1またはどのような割り当てが発生しましたかi = -1?規格では定義されていません。本当に、それはi可能性があります5(これがどのように当てはまるかについての完全にもっともらしい説明については、危害の答えを参照してください)。または、プログラムがセグメンテーション違反になる可能性があります。または、ハードドライブを再フォーマットします。

しかし今、あなたはこう尋ねます:「私の例はどうですか?私-1は両方の割り当てに同じ値()を使用しました。それについて何が不明確である可能性がありますか?」

あなたは正しいです... C ++標準委員会がこれを説明した方法を除いて。

スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用と比較して順序付けされていない場合、動作は定義されていません。

彼らあなたの特別な場合のために特別な例外を作ることができたかもしれませんが、そうではありませんでした。(そして、なぜ彼らは?使用はそれが今までおそらく持っているでしょうか?なければならない)ので、iまだ可能性があり5。または、ハードドライブが空である可能性があります。したがって、あなたの質問に対する答えは次のとおりです。

動作が定義されていないため、未定義の動作です。

(多くのプログラマーが「未定義」は「ランダム」または「予測不可能」を意味すると考えているため、これは強調する価値があります。そうではありません。標準で定義されていないことを意味します。動作は100%一貫している可能性があり、それでも未定義です。)

それは定義された振る舞いでしたか?はい。それは定義されましたか?いいえ。したがって、「未定義」です。

とはいえ、「未定義」とは、コンパイラがハードドライブをフォーマットすることを意味するのではなく、それが可能であり、それでも標準に準拠したコンパイラであることを意味します。現実的には、g ++、Clang、およびMSVCはすべて期待どおりに機能すると確信しています。彼らは「しなければならない」だけではありません。


別の質問は、なぜC ++標準委員会がこの副作用をシーケンスなしにすることを選択したのかということかもしれません。その答えには、委員会の歴史と意見が含まれます。または、この副作用をC ++でシーケンスしないことの良い点は何ですか?、それが標準委員会の実際の推論であったかどうかにかかわらず、正当化を許可します。あなたはここで、またはprogrammers.stackexchange.comでそれらの質問をすることができます。

27
Ingo 2014-02-11 00:23.

2つの値が同じであるという理由だけでルールから例外を作らない実際的な理由:

// config.h
#define VALUEA  1

// defaults.h
#define VALUEB  1

// prog.cpp
f(i = VALUEA, i = VALUEB);

これが許可された場合を考えてみましょう。

今、数ヶ月後、変更する必要が生じます

 #define VALUEB 2

一見無害に見えますね。それでも突然、prog.cppはコンパイルされなくなりました。それでも、コンパイルはリテラルの値に依存すべきではないと私たちは感じています。

結論:コンパイルの成功は定数の値(タイプではなく)に依存するため、ルールに例外はありません。

編集

f(i = -1、i = -1)が未定義の動作であるのはなぜですか?A DIV BBが0の場合、フォームの定数式が一部の言語で許可されておらず、コンパイルが失敗することを指摘しました。したがって、定数を変更すると、他の場所でコンパイルエラーが発生する可能性があります。それは、私見、残念なことです。しかし、そのようなことをやむを得ないものに限定することは確かに良いことです。

12
davidf 2014-02-12 07:25.

混乱は、定数値をローカル変数に格納することは、Cが実行されるように設計されているすべてのアーキテクチャーで1つのアトミック命令ではないということです。この場合、コードが実行されるプロセッサは、コンパイラよりも重要です。たとえば、各命令が完全な32ビット定数を保持できないARMでは、変数にintを格納するには、複数の命令が必要です。一度に8ビットしか格納できず、32ビットレジスタで動作する必要があるこの擬似コードの例。iはint32です。

reg = 0xFF; // first instruction
reg |= 0xFF00; // second
reg |= 0xFF0000; // third
reg |= 0xFF000000; // fourth
i = reg; // last

コンパイラが最適化する場合、同じシーケンスを2回インターリーブする可能性があり、iに書き込まれる値がわからないことが想像できます。彼はあまり頭が良くないとしましょう。

reg = 0xFF;
reg |= 0xFF00;
reg |= 0xFF0000;
reg = 0xFF;
reg |= 0xFF000000;
i = reg; // writes 0xFF0000FF == -16776961
reg |= 0xFF00;
reg |= 0xFF0000;
reg |= 0xFF000000;
i = reg; // writes 0xFFFFFFFF == -1

しかし、私のテストでは、gccは、同じ値が2回使用され、1回生成され、何も奇妙なことをしないことを認識できるほど親切です。-1、-1を取得しますが、定数でさえ見た目ほど明白ではない可能性があることを考慮することが重要であるため、私の例は依然として有効です。

11
supercat 2014-02-11 06:55.

「役立つ」ことを試みていたコンパイラがまったく予期しない動作を引き起こす可能性があると考えられる理由がある場合、動作は一般に未定義として指定されます。

変数が複数回書き込まれ、書き込みが異なる時間に行われることを保証するものがない場合、ハードウェアの種類によっては、デュアルポートメモリを使用して異なるアドレスに対して複数の「ストア」操作を同時に実行できる場合があります。ただし、一部のデュアルポートメモリは、書き込まれた値が一致するかどうか関係なく、2つのストアが同時に同じアドレスにヒットするシナリオを明示的に禁止しています。このようなマシンのコンパイラは、同じ変数を2回連続して書き込もうとしていることに気付いた場合、コンパイルを拒否するか、2つの書き込みを同時にスケジュールできないようにする可能性があります。ただし、一方または両方のアクセスがポインターまたは参照を介している場合、コンパイラーは、両方の書き込みが同じ保管場所にヒットする可能性があるかどうかを常に判別できるとは限りません。その場合、書き込みを同時にスケジュールし、アクセス試行時にハードウェアトラップを引き起こす可能性があります。

もちろん、誰かがそのようなプラットフォームにCコンパイラを実装する可能性があるという事実は、アトミックに処理されるのに十分小さいタイプのストアを使用するときに、そのような動作をハードウェアプラットフォームで定義すべきではないことを示唆していません。2つの異なる値を順序付けられていない方法で格納しようとすると、コンパイラーがそれを認識していない場合、奇妙なことが発生する可能性があります。たとえば、次のようになります。

uint8_t v;  // Global

void hey(uint8_t *p)
{
  moo(v=5, (*p)=6);
  zoo(v);
  zoo(v);
}

コンパイラが「moo」の呼び出しをインライン化し、「v」を変更しないことがわかる場合は、5をvに格納し、次に6を* pに格納し、5を「zoo」に渡してからvの内容を「zoo」に渡します。「zoo」が「v」を変更しない場合、2つの呼び出しに異なる値を渡す方法はありませんが、とにかく簡単に発生する可能性があります。一方、両方のストアが同じ値を書き込む場合、そのような奇妙さは発生せず、ほとんどのプラットフォームでは、実装が奇妙なことをするための理にかなった理由はありません。残念ながら、一部のコンパイラ作成者は、「標準で許可されているため」以外のばかげた動作の言い訳を必要としないため、そのような場合でも安全ではありません。

9
Amadan 2014-02-10 20:42.

この場合、ほとんどの実装で結果が同じになるという事実は偶発的です。評価の順序はまだ定義されていません。考えてみてくださいf(i = -1, i = -2):ここでは、順序が重要です。あなたの例でそれが問題にならない唯一の理由は、両方の値がであるという偶然です-1

式が未定義の動作を持つものとして指定されている場合、悪意を持って準拠したコンパイラはf(i = -1, i = -1)、実行を評価して中止したときに不適切な画像を表示する可能性がありますが、それでも完全に正しいと見なされます。幸いなことに、私が知っているコンパイラはありません。

8
Martin J. 2014-02-10 20:52.

関数の引数式の順序付けに関する唯一のルールはここにあるように私には見えます:

3)関数を呼び出す場合(関数がインラインであるかどうか、および明示的な関数呼び出し構文が使用されているかどうか)、任意の引数式、または呼び出された関数を指定する後置式に関連するすべての値の計算と副作用は次のとおりです。呼び出された関数の本体にあるすべての式またはステートメントの実行前にシーケンスされます。

これは引数式間の順序付けを定義しないため、この場合は次のようになります。

1)スカラーオブジェクトの副作用が、同じスカラーオブジェクトの別の副作用と比較して順序付けされていない場合、動作は定義されていません。

実際には、ほとんどのコンパイラでは、引用した例は正常に実行されます(「ハードディスクの消去」やその他の理論上の未定義の動作の結果とは対照的です)。
ただし、割り当てられた2つの値が同じであっても、特定のコンパイラの動作に依存するため、これには責任があります。また、明らかに、異なる値を割り当てようとすると、結果は「本当に」未定義になります。

void f(int l, int r) {
    return l < -1;
}
auto b = f(i = -1, i = -2);
if (b) {
    formatDisk();
}
8
AlexD 2017-09-13 12:17.

C ++ 17は、より厳密な評価ルールを定義しています。特に、関数の引数をシーケンスします(ただし、順序は指定されていません)。

N5659 §4.6:15
評価AおよびBは、不定のいずれか場合に配列決定されているAが前に配列決定されるB又はBが前に配列決定されたAが、それは不特定です。[:不確定に順序付けられた評価は重複できませんが、どちらかを最初に実行できます。—エンドノート]

N5659 § 8.2.2:5
関連するすべての値の計算と副作用を含むパラメーターの初期化は、他のパラメーターの初期化に対して不確定に順序付けられます。

これにより、以前はUBであったいくつかのケースが可能になります。

f(i = -1, i = -1); // value of i is -1
f(i = -1, i = -2); // value of i is either -1 or -2, but not specified which one
5
JohnB 2014-02-11 04:08.

代入演算子がオーバーロードされる可能性があります。その場合、順序が重要になる可能性があります。

struct A {
    bool first;
    A () : first (false) {
    }
    const A & operator = (int i) {
        first = !first;
        return * this;
    }
};

void f (A a1, A a2) {
    // ...
}


// ...
A i;
f (i = -1, i = -1);   // the argument evaluated first has ax.first == true
2
Peng Zhang 2014-02-10 20:56.

これは、「intやfloatのようなもの以外に「スカラーオブジェクト」が何を意味するのかわからない」という答えにすぎません。

「スカラーオブジェクト」は「スカラー型オブジェクト」の略語、または単に「スカラー型変数」と解釈します。次いで、pointerenum(定数)は、スカラ型です。

これはスカラータイプのMSDN記事です。

2
polkovnikov.ph 2015-04-02 01:03.

実際には、コンパイラがi同じ値が割り当てられていることを2回チェックするという事実に依存しない理由があるため、単一の割り当てに置き換えることができます。表現があるとどうなりますか?

void g(int a, int b, int c, int n) {
    int i;
    // hey, compiler has to prove Fermat's theorem now!
    f(i = 1, i = (ipow(a, n) + ipow(b, n) == ipow(c, n)));
}

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

今週のコミックコンですべての素晴らしいものに追いつく方法

今週のコミックコンですべての素晴らしいものに追いつく方法

サンディエゴコミックコンは今週開幕し、オタクのアナウンス、ポスター、予告編、お気に入りの番組や映画のからかいでいっぱいになります。SDCCは、コンベンションフロア全体の多くのパネルで行われているため、すべてに対応するのは難しい場合があります。

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

Googleの9千万ドルの和解はアプリ開発者にとってもGoogleにとっても勝利ですか?

小さなアプリ開発者は金曜日に発表された法的な和解でグーグルから9千万ドルをこじ開けた。アップルとの同様の合意に続いて熱くなった。金曜日のブログ投稿で、Googleは、Androidメーカーが市場での優位性を悪用してPlayストア経由でのアプリ内購入に対して30%の料金を不当に請求したと主張するアプリ開発者との訴訟を解決するために、9千万ドルを支払うことに合意したと述べました。

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

RadioShackのTwitterはハッキングされていませんでした、それはただの暗号のサクラです

今週、RadioShackのTwitterアカウントは、奇妙なものから完全にひどいものになりました。短い順序で、会社のフィード全体が、バイブレーター、「ビッグティット」(スペルミス)、有名人やその他の企業アカウントを荒らしているツイートなど、NSFW素材の真の山になりました。

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

ヒッグス粒子から10年後、物理学にとって次の大きなものは何ですか?

大型ハドロン衝突型加速器のトンネル内にあるコンパクトミュオンソレノイド(CMS)検出器。2012年7月4日、CERNの科学者たちは、1960年代に最初に提案された素粒子であるヒッグス粒子の観測を確認しました。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Un breve viaje espacial sobre conceptualizar el diseño

Complicarse la vida, mezclar churros con meninas (nada de ovejas) y encontrar valor en un trastero que adquiriste en una puja.

Un breve viaje espacial sobre conceptualizar el diseño

Bien. Hay un momento en toda salida al espacio exterior en el que de la tensión, la velocidad y las altas temperaturas derivadas del cruce de estratosfera a ionosfera se pasa a un momento de súbita calma, donde se despliega la vista completa del paisaje espacial que nos rodea.

Seguindo Todos os Protocolos (2022), de Fábio Leal

Seguindo Todos os Protocolos (2022), de Fábio Leal

Chico quer transar. Até aí, tudo bem.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language