Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译为C++;但不是C(错误:一元操作数需要左值) 这条线在我使用C++时编译,但不是C:_C++_C_Compiler Errors_Lvalue_Rvalue - Fatal编程技术网

编译为C++;但不是C(错误:一元操作数需要左值) 这条线在我使用C++时编译,但不是C:

编译为C++;但不是C(错误:一元操作数需要左值) 这条线在我使用C++时编译,但不是C:,c++,c,compiler-errors,lvalue,rvalue,C++,C,Compiler Errors,Lvalue,Rvalue,gmtime(&(*(time_t*)alloca(sizeof(time_t))=time(NULL))//使用alloca生成左值 我对这种差异感到惊讶。对于C++,甚至没有警告。 当我指定gcc-xc时,消息是: playground.cpp:25:8: error: lvalue required as unary '&' operand gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));

gmtime(&(*(time_t*)alloca(sizeof(time_t))=time(NULL))//使用alloca生成左值

我对这种差异感到惊讶。对于C++,甚至没有警告。 当我指定
gcc-xc
时,消息是:

playground.cpp:25:8: error: lvalue required as unary '&' operand
 gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));
        ^
这里的
&
不是操作员的地址吗?为什么C和C++的不同?

<>虽然我可以在C中使用复合文字,但仍有可能修改我的语法,使它在C+C++?< /P> < P>中在C115.5.16/3:

中都能工作。 赋值运算符将值存储在由左操作数指定的对象中。赋值表达式具有赋值后左操作数的值,但不是左值

在C++14 5.17/1中:

赋值运算符(=)和复合赋值运算符都从右向左分组。它们都需要一个可修改的左值作为其左操作数,并返回一个引用左操作数的左值

(在每种情况下,语言标准的早期版本都规定了相同的内容)

<>由于运算符的地址只能在LValk上操作,C++中代码正确,而C.</P>不正确。
关于问题“是否有可能修改我的语法,使它在C&C++中都能工作?”这不是一个理想的目标;这两种语言是不同的,你应该决定你在写什么。这和坚持在C和Java中都能使用的语法一样有意义

根据其他人的建议,您可以写:

time_t t = time(NULL);
gmtime(&t);
与您的原始存在准则相比,它具有以下优点:

  • 更简单,因此更易于理解和维护
  • 不依赖于非标准的
    alloca
    功能
  • 没有潜在的对齐冲突
  • 不使用更多内存,可能使用更少的内存

另外,区别不在于
&
,而在于
(*(time_t*)alloca(sizeof(time_t))=time(NULL))
是否为左值。另外,为什么不在两行上写这个呢<代码>时间\u t=时间(空);gmtime&t@immibis主要是因为我想获取临时对象的地址(时间值只使用一次)。我发现C中的复合文字很方便,但是我不能在C++中使用它。我不知道这个规则背后的原理,但是我想原来C中从来都不是LValk(很少有任何原因去尝试修改赋值的结果),但是当C++被开发时,为了与重载
操作符=
并返回对self的引用(这是一个左值)的对象保持一致,他们将其更改为左值。干得好。我知道这与关于右值和左值的不同规则有关,但我研究的是
&
运算符,而不是
=
运算符+1.