0

私はcでプログラムに出くわしました:

int bags[5]={20,5,20,3,20};
int main()
{
    int pos=5,*next();
    *next()=pos;   //problem with this line(should give error :lvalue required)
    printf("%d %d %d",pos,*next(),bags[0]);
    return 0; 
}
int *next()
{
    int i;
    for(i=0;i<5;i++)
        if(bags[i]==20)
            return (bags+i); 
    printf("error");
    exit(0);
}

左辺値が必要であると予想していましたが、プログラムへの出力は 5 20 5 です。誰か理由教えてください???

4

3 に答える 3

2

next()は左辺値ではありませんが*next()、これは int であり、戻り値 if *next()(which is an int in theバッグ` 配列) によってアドレス指定されます)。

つまり、関数の戻り値に代入することはできませんが、戻り値によってアドレス指定される値に代入することはできます。

于 2012-04-21T18:51:12.160 に答える
2

next()関数の戻り値は左辺値ではないため、左辺値ではありません。
*next()既知のメモリアドレスに値が含まれているため、左辺値です。このアドレスが関数の戻り値として取得されたか、それ以外の方法で取得されたか (たとえば、変数に格納されたか) は問題ではありません。

于 2012-04-21T18:58:55.797 に答える
0

逆参照演算子の結果は* 左辺値です。

「単項 * 演算子は間接参照を示します。[...] オブジェクトを指している場合、結果はオブジェクトを指定する左辺値です。」C99 6.5.3.2/4

于 2012-04-21T19:03:30.253 に答える