0

Avisynth scipt で使用するフレームのシーケンスを自動生成するこの単純なプログラムを作成しました。

#include <stdio.h>

int main(void) {

    const int step = 3;
    const int arr[] = {31997, 31998, 32001};
    int i, ii = 0;

    for(i = 32002; i <= 32121; i += step, (sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0) {

        printf("freezeframe(%d,%d,%d)\n", i, i + step, arr[ii]);

    }

    return 0;
}

GCC 4.6.2 で MinGW を使用すると、次のエラーが表示されます: 代入の左オペランドとして左辺値が必要です。

この問題は、 ii=0の周りに括弧を使用することで簡単に解決され ます。しかし、なぜそれがエラーになるのかわかりません。代入演算子を最初に評価するべきではありませんか?

4

3 に答える 3

4

C では、条件演算子は代入演算子よりも優先されます。

(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0

として評価される

((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0

C での演算子の優先順位を簡単に確認するには、次を参照してください。

http://www.kernel.org/doc/man-pages/online/pages/man7/operator.7.html

于 2012-12-22T11:19:19.967 に答える
3

ウィケペディアには、これを説明する短いセクションがあります: http://en.wikipedia.org/wiki/Operators_in_C_and_C++#Notes

C の条件演算子の文法は次のとおりです。

logical-OR-expression ? expression : conditional-expression

anassignment-expression a とは見なされずconditional-expression、条件式を代入式の左側にすることはできないため、技術的には構文エラーであることに注意してください。文法を参照してください: http://www.lysator.liu.se/c/ANSI-C-grammar-y.html

ただし、GCC は (誤って) 次のように解析しています。

((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0

++iは左辺値式ではないため、セマンティック エラーです。

于 2012-12-22T11:25:43.507 に答える
0

この方法でコードを記述する場合は、常に括弧を使用することをお勧めします

(sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii = 0

お気に入り

(((sizeof(arr)/sizeof(int) - 1 ) != ii ? ++ii : ii) = 0)

10回中9回はスタックします。

したがって、括弧を付ける習慣をつければ、コンパイラにオーバーヘッドが発生しません!!!

于 2012-12-22T12:57:29.407 に答える