0
 #include<stdio.h>
int f(int a)
{
  a > 20? return(10): return(20);
}
int main()
{
    int f(int);
    int b;
    b = f(20);
    printf("%d\n", b);
    return 0;
}

次のエラーが発生しました

式の構文

関数は値を返す必要があります

パラメータ a は使用されません

4

4 に答える 4

3

?:Cの条件演算子 ( ) は、式のみをオペランドとして受け取ります。

C99 §6.5.15 の文法:

条件式:
論理和式 論理和式
? 式 : 条件式

return ステートメントは式ではなく、ステートメントです。returnしたがって、オペランドにステートメントを入れることはできません。

関数を次のように書き換えることができます。

return a > 20 ? 10 : 20;

サイドノート。GCC(およびclang、およびおそらく他のもの)には、ステートメント式と呼ばれる拡張機能があり、この場合、条件文にreturnステートメントを詰め込むために使用できます。

a > 20 ? ({return 10;}) : ({return 20;});

(私はそれをすることを提唱していますが、それには用途があるかもしれません。)

于 2013-01-10T15:00:04.350 に答える
2

2つのこと:

まず、エラーの原因です。三項演算子を間違って使用しています:

int f(int a)
{
  return (a > 20? (10): (20));
}

a > b ? x : yが返されるxy、あなたに返されます。値を保存できます。

result = a > b ? x : y;

またはこの場合、関数から返すことができます。

この行の 2 番目:

int f(int);

は役に立たないので削除する必要があります


あなたがやろうとしていた方法が間違っている理由は、の構文が?:の右側に式があることを期待しているためです?

プログラミング言語の式は、明示的な値、定数、変数、演算子、および関数の組み合わせです。

returnは式ではなく、ステートメントです (ステートメントは、命令型プログラミング言語の最小のスタンドアロン要素です)。

したがってreturn、式 (三項演算の結果) を作成できます。

于 2013-01-10T14:42:06.233 に答える
1

正しい実装は次のとおりです。

 #include<stdio.h>
int f(int a)
{
  return a > 20? 10: 20;
}
int main()
{
    int f(int);
    int b;
    b = f(20);
    printf("%d\n", b);
    return 0;
}
于 2013-01-10T14:41:04.497 に答える
0

OPは修正ではなく説明を求めました。これが実際の答えです:

式の構文return:ステートメントを ?: 演算子の引数として使用しようとしました。このコードの断片は誤りだったので、コンパイラはそれを破棄してコンパイルを続行しました

関数は値を返す必要がありますreturn: 最初のエラーのため、関数に有効な値がありませんでしたf

パラメータ a は使用されません: 最初のエラーのため、パラメータaは関数で使用されませんf

于 2013-01-10T15:02:28.533 に答える