++i在C、C++中是不是左值?

转载 2015年07月08日 18:34:13

前些天写blog左值与右值(C++学习)时,已经确认在C++中,++i 是左值。可是,今天在newsmth的C语言版上看到一个相关的问题。发现在C语言中,++i不是左值。

例子

一个很简单的例子:

int main()
{
    int i = 0;
    ++i = 5;
    return 0;
}

保存成 hello.c ,分别用 gcc、clang、cl、cc编译

  • gcc 4.5

hello.c: In function ‘main’:
hello.c:4:5: error: lvalue required as left operand of assignment
  • clang 2.8

hello.c:4:9: error: expression is not assignable
    ++a = 5;
    ~~~ ^
1 error generated.
  • cl (visual studio 2010)

用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 16.00.30319.01 版
版权所有(C) Microsoft Corporation。保留所有权利。

hello.c
hello.c(4) : error C2106: “=”: 左操作数必须为左值
  • cc (sun studio 11)

"hello.c", line 4: left operand must be modifiable lvalue: op "="
cc: acomp failed for hello.c

如果将文件保存为 hello.cpp,分别用 g++、clang、cl、CC编译。却则没有任何错误。

C++标准

++i 在C++中是左值,对此 C++标准(5.3.2)中有明文规定

  • The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated). The operand shall be a modifiable lvalue. The type of the operand shall be an arithmetic type or a pointer to a completely-defined object type. The result is the updated operand; it is an lvalue, and it is a bit-field if the operand is a bit-field. If x is not of type bool, the expression ++x is equivalent to x+=1

C 标准

这个,翻了下C99和C1x,没发现明确的条文。

或者我错过了什么重要的东西?抑或犯了很低级的错误? ......


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++拾遗--引用(左值引用、右值引用)

C++拾遗--引用 前言 引用就是别名(alias)。所谓别名,就是对已存在的对象另起一个名字。本身含义并不难理解,但与其它概念一组合,就成了使用难点。再加上新标准提出了新的一种引用-右值引用...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2015年02月23日 18:46
  • 2507

c++操作符重载 类成员函数 类友员函数 左值 右值

一.操作符重载的含义与定义方式 C++已有的操作符只适合处理C++的基本数据类型。重写操作符函数一般定义成类的成员函数或友元函数。 二.操作符重载原则: 1.不能改变运算符的初始意义。2.不能改变...
  • QQ1449301756
  • QQ1449301756
  • 2015年08月16日 16:12
  • 1065

i++与++i作为左值

#include using namespace std; int main() {  int i = 9;  //i++ = 10;   ++i = 10;  return 0; ...
  • djb100316878
  • djb100316878
  • 2014年11月16日 15:31
  • 1339

C++中的三目运算符与左值和右值

三目运算符在C语言中是右值,右值不可以被赋值。但在C++中,三目运算符是左值,左值可以赋值。 在C++中三目运算符返回的是变量本身。 #include #include int main() ...
  • vinnyjia
  • vinnyjia
  • 2017年04月17日 16:51
  • 257

C++左值表达式

今天我们将要谈论的话题——左值表达式——相信不少人从各种途径中或许了解到一些,若是对这个概念还是模模糊糊,那接着看下去就对了,若是对这个概念十分清楚了,那就帮我找找问题,不吝赐教一下吧!     或...
  • oYinGui1
  • oYinGui1
  • 2014年03月06日 21:39
  • 1455

C++——左值引用和右值引用

这篇blog主要介绍一下左值和右值的概念及应用陷阱 1、左值和右值的概念          左值是可以放在赋值号左边可以被赋值的值;左值必须要在内存中有实体;          右值当在赋值...
  • xuyuqingfeng953
  • xuyuqingfeng953
  • 2016年04月04日 20:16
  • 2793

说说C语言与C++的有些区别(一)----为什么C语言没有BOOL类型,而C++有;枚举类型的区别;左值

1.其实C++中的bool类型,是通过枚举来实现的: 如: enum BOOL { FALSE,TRUE }; 所以在C语言中完全也可以用这种方式来实现 2.关于枚举类型, enum ...
  • happyguys12345
  • happyguys12345
  • 2016年09月23日 21:57
  • 610

C语言中左值与右值

声明:本文转自 http://blog.csdn.net/qikaibinglan/article/details/6203483 如果有侵犯他人版权,请通知我我会马上删除     左值就是在赋...
  • Leichelle
  • Leichelle
  • 2011年11月05日 19:44
  • 8517

C++11 左值、右值、右值引用详解

左值、右值在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。...
  • u010599509
  • u010599509
  • 2016年07月27日 13:27
  • 5681

C++11左值右值、转移语义

首先看一下c++11标准新特性: 右值引用: 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语...
  • fffupeng
  • fffupeng
  • 2016年09月20日 15:17
  • 635
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:++i在C、C++中是不是左值?
举报原因:
原因补充:

(最多只允许输入30个字)