我正在编写一个函数,用于打印出程序执行的描述。我的程序中的函数使用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;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
答案 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
我不知道为什么编译器在这个语义错误之前没有大喊语法错误。无论哪种方式,如果有人对这个答案感到沮丧,我建议您检查变量名称之前是否尚未在某处定义为宏或类似名称。