`
Michaelmatrix
  • 浏览: 209474 次
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于自加++,左值的问题

 
阅读更多

先给出结论:

i++ = 5; 错

++i = 5; 对

原因为何:i++的运算结果并不是i这个变量的引用,而是一个临时变量,其值为i的值,所以你无法进行以下运算:
i++=5;甚至编译器不允许你对一个临时变量重新赋值,上面的表达式会引起编译错误 。

左值,说得通俗一点,就是可以出现在表达式左边的值(等号左边),可以被改变。
a = 5;
a是左值。
不能被改变的值不是左值,常量像5,'a',"abc123"这种都不能做左值。
自加/减运算符的操作数如果不是左值就不能自加和减。
但i++的操作就不能作左值,它返回一个临时变量。++i可以是左值,它返回i被加1后的自己。a = (i++) * 5 ;
==> temp = i;
i = i + 1;
a = temp + 5;
a = (++i) * 5;
==> i = i + 1;
a = i * 5;
temp没有在你的程序中出现,那是编译器自动做的,你不能给temp赋值。

笔试碰到一题目:

1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C 错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11

因为对此题目含糊不清,导致错选c,做个记号。

本博客大部分为转载,本人不保证正确,请甄别
分享到:
评论

相关推荐

    java基础知识点研究.txt

    1、赋值顺序不同 ++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的。 因为++i 是后面一步才赋值的,所以它能够当作一个...形象的理解可以是i++先做别的事,再自己加1,++i先自己加1,再做别的事情。

    计算数_将简单的加减乘除括号公式解析成树的结构.zip

    使计算数_将简单的加减乘除括号公式解析成树的结构,用python解析简单的加减乘除括号表达式 成计算树,并以左值计算打印

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

    5.6 如果NULL定义成#define NULL((char *)0) ,不就可以向函数传入不加转换的NULL 了吗? 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针...

    C语言FAQ 常见问题列表

    o 6.6 如果 NULL 定义成 #define NULL ((char *)0) 难道不就可以向函数传入不加转换的 NULL 了吗? o 6.7 如果 NULL 和 0 作为空指针常数是等价的, 那我到底该用哪一个呢? o 6.8 但是如果 NULL 的值改变了, 比如...

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

    5.6 如果NULL定义成#define NULL((char *)0) ,不就可以向函数传入不加转换的NULL 了吗? 57 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 57 5.8 NULL可以合法地用作函数指针吗? 57 5.9 如果NULL...

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

    5.6 如果NULL定义成#defineNULL((char*)0),不就可以向函数传入不加转换的NULL了吗? 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针...

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

    老资源。 目录 1 声明和初始化1 1.1 我如何决定使用那种整数类型? . . . .... ....5.11 为什么有那么多关于空指针的疑惑?为什么这些问题如此经常地 出现? . . . . . . . . . . . . . . . . . . . ...

    C 语言编程常见问题解答.chm

    12 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗? 1. 13 ++var和var++有什么区别? 1. 14 取模运算符(modulusoperator)“%”的作用是什么? 第2章 变量和数据存储 2. 1 变量存储在内存...

    c++11智能指针解析——揭开底层面纱,完整理解智能指针.pdf

    c++11智能指针解析——揭开底层⾯纱,完整理解智能指针 昨天跟同事⼩⼩的研究了下关于不同平台下的字节对齐问题,起因是遇到了⼀个坑,vs上没有问题,在安卓上却崩溃了。找了半天后发现是 c++字节补齐问题,期间包括...

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

    和代码中的char *test[]一样,同为字符指针,当你把参数传递过来的时候,事实上不是把数组内容传递过来,test的首地址传递了进来,由于array是指针,所以在内存中它在栈区,具有变量一样的性质,可以为左值,所以我们输出写成...

    c-c++及数据结构基础视频教程完整版,最适合自学的c++基础

    第二部分C++基础目录 01_C++基础课程的安排和需要持之以恒的学习态度 02_简单的C++程序helloworld 03_用面向过程和面向对象...21_函数返回值是引用(当左值右值)_传智扫地僧源码及文档 01_上一次课程复习 02_指针的引用_

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

    2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由C...

    自定义的矩阵类,内含源码与测试工程

    2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由C...

    传智播客扫地僧视频讲义源码

    17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统框架集成第三方产品案例_集成测试加密厂商和socket厂商入围 19_信息系统框架集成第三方产品案例_集成框架变成类方式_传智扫地僧 20_...

    解决三元运算符 报错“SyntaxError: can”t assign to conditional expression”

    expression是表达式,就是加减乘除等各种运算符号连接起来的式子(statement是语句,如if语句,while,复制语句等); 三目运算中表达式只能作为左值 修改后: a=1 b=1 x=1 if a==b else 0 print(x) [on true] if ...

    C语言编程要点

    1.12 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗? 17 1.13 ++var和var++有什么区别? 17 1.14 取模运算符(modulus operator)“%”的作用是什么? 17 第2章 变量和数据存储 18 2.1. 变量存储在...

Global site tag (gtag.js) - Google Analytics