#include<stdio.h>
int main()
{
int i=7,j;
j=(i++,++i,j*i);
return 0;
}
j =(i ++、++ i、j * i);これは明確に定義されていますか?私の疑問を明らかにさせてください。
#include<stdio.h>
int main()
{
int i=7,j;
j=(i++,++i,j*i);
return 0;
}
j =(i ++、++ i、j * i);これは明確に定義されていますか?私の疑問を明らかにさせてください。
コンマ演算子はシーケンスポイントであるため、この式は問題ありません。
(i++, ++i, j*i)
ただし、コンマがシーケンスポイントとして機能していない場合は、次のように混同しないでください。
somefunction(i++, ++i, j*i)
j = i ++ *++iはどうですか
乗算演算子はシーケンスポイントではありません。
(すみません、あなたの答えをハイジャックします)
ISO 9899:1999(C標準)の§3.4から:
3.4動作
外観またはアクション
3.4.1実装定義の動作
各実装が選択の方法を文書化する不特定の動作
例実装定義の動作の例は、符号付き整数が右にシフトされたときの上位ビットの伝播です。
3.4.2ロケール固有の動作
各実装が文書化する国籍、文化、言語の地域の慣習に依存する行動
例ロケール固有の動作の例は、islower関数が26個の小文字のラテン文字以外の文字に対してtrueを返すかどうかです。
3.4.3未定義動作
この国際規格が要件を課していない、移植性のない、または誤ったプログラム構成または誤ったデータの使用時の動作
注考えられる未定義の動作は、予測できない結果を伴う状況を完全に無視することから、環境に特徴的な文書化された方法での翻訳またはプログラムの実行中の動作(診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了(診断メッセージの発行)。
例未定義動作の例は、整数オーバーフローでの動作です。
3.4.4不特定の動作
この国際規格が2つ以上の可能性を提供し、どのような場合でも選択される要件を課さない場合の動作
例指定されていない動作の例は、関数の引数が評価される順序です。
コードでは、「、」がシーケンスポイントとして機能します。
だからこれで
j=(i++,++i,j*i);
表現は左から右への作業になります。
したがって、最初はi ++、次に++ i、次にj*iです。
最後に、j*iはjに格納されます。
ただし、最後に、「j」には事前定義されたデータがない
ため、未定義の値がjに格納されるため、結果はエレガントになります。
「()」を使用しない場合
コードは、次のような単一のステートメントとして機能します
j=i++;
++i;
j*i;