2012-01-16 6 views
1

上記のコードは素晴らしい作品が、私は変更括弧の余分なセットを削除する場合代入エラーの左オペランドとして必要なl-値ですが、なぜですか?一般的には

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char* mystrncpy(char* dst, const char* src, size_t n) { 
    char* temp = dst; 

    while (n-- > 0 && (*temp = *src)) { 
     temp++; 
     src++; 
    } 

    return dst; 
} 

int main() { 
    const char* str = "Hello World!"; 
    char buf[50]; 
    memset(buf, 0, sizeof(buf)); 
    mystrncpy(buf, str, sizeof(buf)); 
    printf("%s\n", buf); 
} 

...このエラーが発生した理由を私は知っているが、私は、この特定のインスタンスで少し混乱していますwhileループ:

while (n-- > 0 && *temp = *src) 

エラーが発生します。私はオペレータの優先順位については何かだと思うが、私はちょっと困惑している。誰かがこのコンパイラのエラーを表示するためにループの変更を行っている間に何を説明することができますか?

+4

演算子の優先順位の問題が既に疑わしい場合は、式の中の演算子の優先順位のルールを調べるのを止めますか? –

+0

@KerrekSB時にはプッシュは長い道のり:)。 – JonH

+1

正に、私はC++にとても慣れていて、実際のCコードを見ると、私はいくつかのことを当然と考えていることがあるので、私は仮定して見逃すかもしれない「余分なおかず」があるかどうかを尋ねたい。たとえば、Cでstructキーワードを使う方法の全体的な考え方は、最近私の心を揺さぶっていました - そして、どのように構造体と同じ名前の構造体をtypedefできますか? –

答えて

5

はい、それは優先です。

=は、&&より低い優先度を持ちます。したがって、後者の場合のように解析する:

while ((n-- > 0 && *temp) = *src) 

もちろん(n-- > 0 && *temp)のL値ではありません。

=の代わりに ==を使用するつもりはありませんでしたか?

+1

私は答えに同意しますが、はい、彼はそれらを比較しない文字を割り当てるので '='を使うべきです。それでも私はあなたの意図は問題を説明することだと思う+1。 – JonH

+0

ありがとうございます! :) –

2

割り当てはそう

n-- > 0 && *temp = *src 

が有効C.

0

Operator precedenceない

(n-- > 0 && *temp) = *src 

に相当し、precedence非常に低いがあります。それはあなたが明らかでないn-- > 0 && *tempの結果、に割り当てるしようとしているようですので、& &オペレータは、位置13にあり、= 16

4
n-- > 0 && *temp = *src 
 
          = 
         /\ 
         && *src 
         /\ 
         > *temp 
        /\ 
        n-- 0 
+0

+1の美しいグラフ:)それを見るのは良い方法です。 –

+0

ありがとうございます - あまりにも多くの括弧を使用することを恐れてはいけません:) – pmg

+0

+1あなたのピカソ。 – JonH

0

代入演算子は本当に低い優先順位を持っています左辺値。

関連する問題