以下c程序的编译时错误的正确解释是什么?

时间:2013-01-10 14:36:48

标签: c compiler-errors

 #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 个答案:

答案 0 :(得分:3)

C中的条件运算符(?:)仅将表达式作为操作数。

C99§6.5.15的语法:

  

条件表达式:
  逻辑OR-表达
  逻辑OR表达式?表达式:条件表达式

return语句不是表达式,而是一个声明。所以你不能在操作数中添加return语句。

您可以使用以下内容重写您的功能:

return a > 20 ? 10 : 20;

旁注。 GCC(和clang,可能还有其他人)有一个名为statement expressions的扩展名,您可以在这种情况下使用它来填充条件中的return语句:

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

(我主张这样做;但可能会有用途。)

答案 1 :(得分:2)

两件事:

首先,您的错误来源,您正在使用ternary operator错误:

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

a > b ? x : y将向您返回xy,您可以存储该值:

result = a > b ? x : y;

或者在这种情况下,你可以从函数返回。

第二行:

int f(int);

没用,应该删除


你试图这样做的原因是错误的,因为?:的语法要求在?

的右侧有一个表达式

编程语言中的表达式是显式值,常量,变量,运算符和函数的组合。

return不是表达式,而是一个语句(语句是命令式编程语言中最小的独立元素。)

因此,你可以return表达式(三元运算的结果)。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

OP要求解释,而不是纠正。这是实际答案:

表达式语法:您已尝试将return语句用作?:运算符的参数。这个 代码片段是错误的,因此编译器将其丢弃并继续编译

函数应返回值:由于第一个错误,函数return中没有有效的f

从不使用参数a :由于第一个错误,函数a中未使用参数f