C代码错误出错:表达式不可分配

时间:2017-03-21 05:57:46

标签: c compiler-errors expression variable-assignment cc

我正在编写一个函数,用于打印出程序执行的描述。我的程序中的函数使用0作为基数为10的数字转换的信号。

我希望我的程序具有友好输出,并告诉用户数字是否已转换为基数10,而不是让程序说该数字是从基数0转换而来。

当我尝试编译此代码时,收到一条错误消息,指出“表达式不可分配”。

我正在使用cc编译器

编译命令行

Apple LLVM版本7.3.0(clang-703.0.29)

知道这个错误意味着什么以及如何纠正? 谢谢。

void foo( int base ){

    int theBase;

    base == 0 ? theBase = 10: theBase = base;

    printf("%s%d\n", "The base is ", theBase)
}

错误消息:

error: expression is not assignable base == 0 ? theBase = 10: theBase = base; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^

5 个答案:

答案 0 :(得分:2)

你在这里做的是一个条件分配。

通常你可以这样做:

if (base == 0)
    theBase = 10;
else
    theBase = base;

在这里你选择使用三元表达式。它确实有点像if / else结构,但它确实不同。

三元组返回一个值,它不会根据条件执行代码。不,它根据条件返回一个值。

所以在这里,你必须这样做:

theBase = (base == 0 ? 10 : base);

(括号不是必需的,但要避免错误要好得多)。

实际上,您可以以多种方式创建三元执行代码,例如返回函数:

int my_function()
{
    printf("Code executed\n");
    return (10);
}

/* ... */

theBase = (base == 0 ? my_function() : base);

修改

是的,您可以使用该代码:

base == 0 ? (theBase = 10) : (theBase = base);

但在这种情况下使用三元组是没用的,因为你仍然需要复制theBase = X代码。

答案 1 :(得分:1)

因为你需要左值,它所属的位置,在表达式的左侧,就像这样

theBase = (base == 0) ? 10 : base;

注意编译器如何考虑

base == 0 ? theBase = 10 : theBase

与该表达式中的“ lvalue ”类似,因为运算符优先。

ternary operator是操作员,因此您无法使用它来替换 if 语句。

答案 2 :(得分:0)

你应该使用

theBase = (base == 0 ? 10 : base);

而不是

base == 0 ? theBase = 10: theBase = base;

答案 3 :(得分:0)

您必须在作业周围添加括号

base == 0 ? (theBase = 10) : (theBase = base);

其他优先事项就是在欺骗你。更好的是,使用惯用语法:

theBase = base ? base : 10;

答案 4 :(得分:0)

不回答问题,但可能对遇到此问题的其他人有所帮助: 就我而言,我有合法的任务,例如:

int xyz = 5;

我不知道在包含的标题中的某处有以下行:

#define xyz 14

我不知道为什么编译器在这个语义错误之前没有大喊语法错误。无论哪种方式,如果有人对这个答案感到沮丧,我建议您检查变量名称之前是否尚未在某处定义为宏或类似名称。