1

ファイルを追加モードで開いたり、$flag に基づいてその内容をすべて消去したりしたくありません

static void do_redirect(int filedes, const char *filename, int flag){
int rc;
int fd;

flag == 1 ? fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644) : 
            fd = open(filename, O_CREAT| O_RDWR, 0644);

}

割り当ての左オペランドとして必要な llvalue を取得するのはなぜですか?

4

3 に答える 3

2

優先だから。式は暗黙的に括弧で囲まれています

(flag == 1 ? fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644) : fd) = open(filename, O_CREAT| O_RDWR, 0644);

条件式の値が左辺値ではありません。

書く

flag == 1 ? (fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644)) : 
            (fd = open(filename, O_CREAT| O_RDWR, 0644));

または、条件式をopen呼び出し内に移動します。

于 2013-03-15T16:18:34.483 に答える
2

優先順位の問題です。

次のように書き直すことをお勧めします。

fd = open(filename, O_CREATE | O_RDWR | (flag == 1 ? O_TRUNC : 0), 0644);
于 2013-03-15T16:18:38.317 に答える
1

左辺値エラーが発生するのはなぜですか?

あなたの条件式は次のようなものです:

flag == 1 ? fp = 1 : fp = 2; 

次のように C で解析されます。

(flag == 1 ? fp = 1 : fp) = 2;  

  ^ expression            = value   

左辺値エラーの原因となる式に値を割り当てることはできません。

正しい答えは、条件式を修正できる括弧を追加することで@Daniel Fischerによって与えられます(実際には優先順位をオーバーライドします)。

しかし興味深いことに、この you 式は C++ 言語では正しいのです。
ここでチャールズ・ベイリーの答えを読んでください: C と C++ の間の条件演算子の違い。また、左辺値エラーが発生する理由についての詳細な回答も見つかります。
私の答えはそこへの単なる参照です

@Daniel Fischerと@Joachim Pileborgが2つのトリックに答えますが、次のように同じことを達成することもできます:

fd = flag == 1 ? -2 : 3 ;

fdはい、ただし、true/false 式の両方で使用しているため、これはあなたの場合にのみ可能です

于 2013-03-15T16:34:27.093 に答える