Tag: lvalue

使用(void *)作为通用数据容器时的L值问题

这是程序中使用的结构: struct basic_block { void * aux; /* Many other fields, which are irrelevant. */ }; 现在: 在程序执行期间存在几个basic_block实例。 该程序分阶段/通过,一个接一个地执行。 aux字段用于在阶段执行期间存储stage和basic_block特定数据,并由阶段本身释放(因此下一阶段可以重用它)。 这就是为什么它是一个void * 。 我的舞台使用aux来存储一个struct ,所以每次我想访问某些东西时,我都要做一个强制转换: ( (struct a_long_struct_name *) (bb->aux))->foo_field = foo; 现在,我的问题:每次像这样投下它是一种痛苦,当它是更复杂的表达式的一部分时难以阅读。 我建议的解决方案是:使用宏为我做演员: #define MY_DATA(bb) \ ( (struct a_long_struct_name *) (bb)->aux) 然后我可以访问我的数据: MY_DATA(bb)->foo_field = foo; 但是:我不能将MY_DATA(bb) 本身用作L值(对于malloc ),所以我使用该宏并不是一个好主意: /* WRONG! I cannot assign to […]

合法的数组赋值。 可能吗?

在阅读了关于K&R书中结构的章节之后,我决定做一些测试来更好地理解它们,所以我写了这段代码: #include #include struct test func(char *c); struct test { int i ; int j ; char x[20]; }; main(void) { char c[20]; struct {int i ; int j ; char x[20];} a = {5 , 7 , “someString”} , b; c = func(“Another string”).x; printf(“%s\n” , c); } struct test func(char *c) { struct […]

什么`int const a `真正意味着什么?

考虑以下数组声明: int const a[5]; 从语言的语义角度来看,它是否完全等同于const int a[5] ? 假设是这种情况,两个声明基本上都会读作“ a是5个常量整数的数组 ”。 读取第一个声明的另一种方法是“ a是一个5个整数的常量数组 ”。 显然,这两个陈述逻辑上都暗示整个数组是不变的; 如果一个数组由5个常量整数组成,则整个数组是常量。 或者,如果整个数组是常量,那么它的所有值也是常量。 我知道“常量数组”的概念有点无意义,因为数组不是可修改的左值(也就是说,它们不能出现在赋值的左侧)。 但是,在这两种声明会产生不同行为的情况下是否存在? ( Cdecl.org拒绝将第一个声明作为语法错误,而大多数当前编译器都接受它。) 编辑: 链接的副本询问const的顺序是否对普通变量很重要。 对于数组,它有点混乱,所以我不认为这是重复的。

为什么预增量运算符在C中给出rvalue?

在C ++中,预增量运算符给出左值,因为返回了递增的对象本身,而不是副本。 但在C中,它给出了右值。 为什么?

左值作为赋值的左操作数

我为什么要来 lvalue required as left operand of assignment 用单个字符串比较? 我怎样才能在C解决这个问题? if (strcmp(“hello”, “hello”) = 0) 谢谢!