`
tomhibolu
  • 浏览: 1384936 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

前些天写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,没发现明确的条文。

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


分享到:
评论

相关推荐

    关于i++和++i以及左值,右值

    本文主要讲了关于i++和++i以及左值,右值的问题,希望对你的学习有所帮助。

    为什么(i++)不能做左值,而(++i)可以

    本文主要讲了为什么(i++)不能做左值,而(++i)可以的原因,希望对你的学习有所帮助。

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题25:关键字static在C和C++中的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C中的malloc和C++中的new有什么区别 面试题28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 ...

    你必须知道的495个C语言问题.pdf

    作者在网络版CFAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    C语言FAQ 常见问题列表

    o 3.5 在 C 中是否有模拟继承等面向对象程序设计特性的好方法? o 3.6 我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr 数组用起来好像有多个...

    4737 C++程序设计 自考串讲笔记.doc

    7.左值表达式在赋值语句中既可以作为左操作数,也可以作为右操作数。而右值表达式在赋值语句中只能作为右操作数。 8.指向常量的指针是在非常量指针声明前面使用const,比如:const int *p 9.在数组的泛型算法中,要...

    经典C/C++面试题目大汇总(全附答案).doc

    原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。 引用型参数应该在能被...

    《你必须知道的495个C语言问题》

    *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 22 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 23 2.7 我遇到这样声明结构的代码:struct name {int namelen; ...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    18.1.4 在函数中抛出异常 546 18.1.5 异常说明 547 18.2 异常处理的编程技术 549 18.2.1 抛出异常的时机 549 18.2.2 异常类的层次结构 552 18.2.3 测试可用内存 552 18.2.4 再次抛出异常 552 第19章 标准...

    你必须知道的495个C语言问题

    *2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:structname{intnamelen;charnamestr[1];}...

    你必须知道的495个C语言问题(PDF)

    2.5 在C 中是否有模拟继承等面向对象程序设计特性的好方法? . . . 7 i 目录ii 2.6 我遇到这样声明结构的代码: struct name f int namelen; char namestr[1];g; 然后又使用一些内存分配技巧使namestr 数组用起 来...

    关于c++的 右值 右值引用 move

    第一次接触c++move操作就懵逼了,一直想探个究竟,但是右值以及右值引用思考了好长时间,就是不得要领,今天终于有所收获,写下第一篇博客,一方面为了帮助一些刚入门的朋友,另一方面也是帮助自己今后复习。...

    一维动态数组实现的矩阵类

    鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数======================...

    C语言精典版本C程序设计语言

    在这段时间中,C语言也在悄悄地改变,并且早已超出了仅仅作为UNIX操作系统的语言的范畴。 C的适用范围的扩大、在这些年中语言的改变和各个组织开发的超出其预定内容的编译器,所有这一切要求对C语言有一个比本书第1...

    指针数组和数组指针的区别.doc

    答案是这样的,在c++中,输出字符指针就是输出字符串,程序会自动在遇到\0后停止.  我们最后分析一下段2中的代码,段2中我们调用了print_array()这个函数,这个函数中形式参数是char *array[]和代码中的char *test[]...

Global site tag (gtag.js) - Google Analytics