C语言辨析——int a=5;为什么++a=1能编译通过而a++=1不行呢?

这篇具有很好参考价值的文章主要介绍了C语言辨析——int a=5;为什么++a=1能编译通过而a++=1不行呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题

有人问:int a=5; 为什么++a=1能编译通过a++=1编译错误呢?

解释:不管是++a=1还是a++=1在C编译环境下都无法编译通过,但在C++中,++a=1可以编译通过,而a++=1无法编译通过,这也是C和C++的一个不同。因此,这是一个关于C++的问题

2. 分析

不管是C还是C++,语句a++=1;的行为是未定义的,因为它违反了“如果在没有序列点的表达式中多次修改同一标量的行为是未定义行为”。

对于++a=1,等效于(a+=1)=1,对于C而已 (a+=1)不是左值,因此不能将1赋值给++a。因此,在C中编译通不过,给出的错误信息是:

[Error] lvalue required as left operand of assignment

但对于C++而言,表达式++a=1是正确的,因为++a在C++ 标准中是左值,因此,语句++a=1;在C++中是正确的语句。虽然该语句在C++中是正确,但不建议这样写。

表达式a++=1在C或C++中都是错误的,因为它试图两次修改同一个对象,这是不允许的。讨论这个话题就像讨论一个错误的时钟在一个小时后的时间是多少而已。

注:左值(Ivalue)这个词最初源自赋值表达式E1=E2,其中左操作数E1必须是(可修改的)表达式。对象(object)是一块内存区域,可以读取它的值或者向它存储数据。一般将左值视为对象的“定位值(locator value)”,即左值是一种表达式,可以通过它读取或修改它所引用的对象。例如,表达式a和b都是左值,但表达式3和b+3都不是左值。再如,若一元表达式E是一个指向对象的指针,则*E是一个左值,表示E指向的对象。

C99左值的定义是:左值是具有对象类型非void的不完整类型的表达式,如果左值在求值时没有指定对象,则其行为是未定义的。

C11起左值的定义是:左值是一个表达式,该表达式潜在地指示一个对象,且该对象类型不是void,如果左值在求值时没有指定对象,则其行为是未定义的。

3. 进一步分析

在C标准中,由自增和自减运算符构成的表达式是右值(在C标准中,有时把右值(rvalue)描述为表达式的值),但在C++中,前缀形式的运算符构成的表达式是左值。因此,在C语言中,即a++和++a不是左值而是右值,因此无法为它们赋值。而在C++ 中++a是左值,因此可以给++a赋值,这就是为什么在C++中语句++a=1; 能编译通过的原因。

注:在C标准中,赋值和复合赋值运算符构成的表达式是右值,但在C++中是左值。例如 表达式(a=3*4)=5+6在C中是错误的,但在C++ 中是正确的。对于表达式a=3*4来说,在C中不是左值,因此不能将表达式5+6赋值给它,但在C++ 中它是左值,因此,可以将5+6赋值给(a=3*4)。

4. 经验

如果一个变量出现在一个函数的多个参数中,不要对该变量使用递增或递减运算符。

如果一个变量多次出现在一个表达式中,不要对该变量使用递增或递减运算符。

C语言学习50

C语言学习 · 目录

上一篇C 语言基本概念----序列点下一篇C语言辨析——深入理解格式字符的用法文章来源地址https://www.toymoban.com/news/detail-792929.html

到了这里,关于C语言辨析——int a=5;为什么++a=1能编译通过而a++=1不行呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法| Java的int类型最大值为什么是21亿多?

    本文主要介绍在 Java 中,为什么 int 类型的最大值为 2147483647 。 我们都知道在 Java 中, int 的长度为32位。 理论上,用二进制表示,32位每一位都是1的话,那么这个数是多少呢? 我们来计算一下,第0位可以用20^00表示,第1位可以用21^11表示,第31位可以用231表示,那么32位二进

    2024年02月04日
    浏览(45)
  • int和Integer的区别,Java为什么要设计包装类呢?

    1.默认值不同 作为成员变量来说,int的初始默认值为 0 ,而Integer为 null 。 2.存储的内存位置不同 Integer是一个类,其对象存储在 堆 内,int是基本数据类型,存放在 栈 中。 3.作用不同 Integer类里面封装了很多的属性以及方法,使用起来会更加的 灵活 。 Java为什么要设计基本类

    2024年02月13日
    浏览(50)
  • 【C语言】scanf和strcpy这类关键字和函数为什么不安全,使用VS编译会报错

    首先先说解决方法: 在程序最顶端加入这个代码段 这主要是微软的 C 运行时库实现将这些函数标记为不安全,主要原因是这些函数缺乏对输入长度的边界检查,容易导致缓冲区溢出漏洞。 会产生这样的报错: 即: C4996    \\\'strcpy\\\': This function or variable may be unsafe. Consider usin

    2024年02月14日
    浏览(56)
  • 为什么要交叉编译?

    1、什么是交叉编译? 交叉编译:是在一个平台上生成另一个平台上的可执行代码。比如 我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。 我们在Windows上面编写C51代码,并编译成可执

    2024年02月03日
    浏览(42)
  • Mybatis为什么需要预编译等一系列问题

    SQL 预编译是一种提高数据库访问效率的技术,它通过将 SQL 语句预编译并存储在数据库中,减少每次执行时需要进行解析和编译的开销,从而提高数据库访问的效率。 在预编译阶段,SQL 语句会被解析并转换为可执行的二进制代码,然后存储在数据库中。当需要执行该 SQL 语句

    2024年02月10日
    浏览(43)
  • 预编译为什么能防止SQL注入?一看你就明白了。预编译原理详解

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 先简单了解一下SQL注入的过程。 比如一个查询功能,根据用户输入的id,查

    2024年02月07日
    浏览(45)
  • 【2023,学点儿新Java-14】携程面试题:如何看待Java是一门半编译半解释型的语言?| 咨询互联网行业 资深前辈的一些问题 | 附:为什么说ChatGPT的核心算法是...?| GPT-3.5

    前情回顾: 【2023,学点儿新Java-13】阶段练习之Java面试企业真题(阿里巴巴拼多多 等) | 常用的Java命令行操作都有哪些 | 如何解决Java的内存泄漏和内存溢出问题? 【2023,学点儿新Java-12】小结:阶段性复习 | Java学习书籍推荐(小白该读哪类Java书籍?有一定基础后,再去读

    2024年02月09日
    浏览(46)
  • C++中,C::C::C::C::foo() 为什么编译成功?

    有人问: 为什么 最后那行: 能编译成功?这是什么规则? 嗯…… Entity::Entity::Entity::Entity::Entity::Entity::foo() 竟然编译成功?这一切的背后,是人性的扭曲,还是道德的沦丧? 敬请关注今晚八点 CPPTV 12 频道,让我们跟随镜头走进厚厚的C++标准文档…… 这个案例,至少牵涉到

    2024年02月12日
    浏览(54)
  • 为什么我的小程序审核不通过?常见原因及解决方法

    作为程序员、小程序的开发者,工作中比开发小程序还要让人头疼的事,也就只有就是让小程序通过审核了!每隔三五天,总会看到有同行在社区吐槽“吐槽下微信小程序审核机制”、“微信小程序审核不通过 放弃了,细数坑坑”。。。 认证费问题 在讲小程序审核问题之前

    2024年02月10日
    浏览(53)
  • 为什么C语言运行效率高

    C语言是一种高效的编程语言,因为它具有多种优点,使其成为一种非常适合进行系统级编程的语言。在本文中,我将详细解释C语言之所以高效的原因,并且探讨一些C语言程序员可以采取的最佳实践。 C语言是一种低级别编程语言,它允许程序员直接访问内存。这意味着程序

    2023年04月24日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包