掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VC++のscanf()の文字入力で、入力済みの変数が変更されてしまう。 (ID:57495)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
より正確に言うなら ・未定義:誤ったプログラム素片。結果がどうなるかは誰も何も保証しない。 暴走するかもしれないし、エラーで止まるかもしれないし、 はたまたプログラマの期待通りに動くかもしれない。 ・処理系定義:正しいプログラム素片。ベンダが動作をマニュアルに記述すべきもの。 ・未規定:正しいプログラム素片。ベンダが動作を記述しなくて良いもの。 未定義の例:fflush(stdin); // エラーになっても、未処理の入力が消されてもいい。 処理系定義の例:sizeof int や CHAR_BIT などの具体的値。 未規定の例: a=f()+g(); で実際に f() と g() のどちらが先に呼ばれるか。 未定義は「誤ったプログラム」なので、使うべきでないというより 「使ってはいけない」のです。 処理系定義、未規定は正しいプログラムなので、使ってよいのです。 ただしその動作はコンパイラのベンダや種類やバージョンなどによって異なりうるわけです。 そのため注意して使う必要があります。 wc=(getchar()<<8)|getchar(); は未規定のプログラム例です。 プログラマはこれで SJIS 1文字を受理するつもりなのでしょうが、 ある処理系では「プログラマの期待通りの動作」 ある処理系では「プログラマの期待に反した動作」 をするでしょう。しかしどちらも規格書的には「正しい動作」です。 処理系依存性を除くには wc=getchar()<<8; wc|=getchar(); とすべきでしょう。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.