2

プログラムの最初に NULL に初期化された char ポインターがあります。さらにプログラムでは、char* が関数呼び出しで使用され、char の文字列を指す場合があり、null char を指す場合があります。手付かずのまま。したがって、式が左から右に評価される場合、次のステートメントは正しいはずです。そうでない場合、strlen ( charpointer )は未定義の動作です。 charpointer == NULLの場合

if (  charpointer == NULL || strlen ( charpointer ) == 0  )

それで、それらは左から右に評価されますか?これは、このようにチェックする正しい方法ですか?

4

5 に答える 5

4

if評価プロセスの特性は、ステートメントとはまったく関係ありません。評価は、式自体のプロパティによって決定されます。それが使用されているという事実はif、まったく違いはありません。

あなたの場合、問題の式は

charpointer == NULL || strlen ( charpointer ) == 0

その動作は主に operator のプロパティによって定義され、||左から右に評価されることが保証されます。最初のオペランドは に評価されtrueます。

つまり、元の投稿の制御式は完全に安全です。

于 2013-08-26T19:04:46.160 に答える
2

評価の順序は、他の人が示すように左から右ですが、論理式の真 (またはその欠如) を判断できる時点で評価が停止することを理解することが重要です。

これは両方の場合です || と &&。

これは特に重要です。式全体が評価されると想定できないため、論理式のコンポーネントのいずれかに副作用 (関数呼び出し、インクリメント、代入など) がある場合、すべてが評価される必要はないからです。実行されました。

于 2013-08-26T18:56:31.040 に答える
2

charpointernull かどうかをテストします。

   if (charpointer == NULL) { // etc.

charponter が NULL 文字を指しているかどうかをテストするには、次のようにします。

   if ((charpointer != NULL) && (strlen(charpointer) == 0) { // etc.

これらのステートメントを次のように組み合わせることができます。

   if (charpointer == NULL) {

   } else {
        if (strlen(charpointer) == 0) { // etc.

またはとして:

   if ((charpointer != NULL) && (strlen(charpointer) == 0)) {// etc.

または、コードが行っている短絡に頼ることができます。ただし、式は左から右に評価されるため、charpointer == NULL のテストを最初に行う必要があります。

最後に、かなりの量の C コードを作成すると、次のことがわかります。

   if (! charpointer)  {  // etc.

NULL に等しいかどうかをテストするのと同じです。ですから、気まぐれで読めないコードを書くには、次のようにします。

   if (!charpointer || !(strlen(charpointer)) { // etc.
于 2013-08-26T19:00:06.323 に答える