关于华为一道面试题 ( ++a )和( a++ ) .
2012-08-01 21:44
423 查看
关于华为一道面试题 ( ++a )和( a++ )
昨天偶尔在网上看到一道华为面试题,觉得有点无语,这么NB的公司也出这种没有意义的题目,唉~~~话不多说,贴上代码:
上面还有我自己的解释:
[cpp]
view plaincopyprint?
/*
这个例子主要是考虑到a++和++a的存储问题;
我们知道,对于a++是先将a给表达式再++;
那么这就是需要一个tmp空间来保存++之前
的a!!!但是对于++a是不需要的,因为先
执行++,那么就是直接改a空间内容就好了!
那么我们下面的问题就是这样!
*/
#include <stdio.h>
int main()
{
int a = 4;
/*
解释:下面的答案在Linux和VC下测试是9;
如果这样的形式不好看,那么写成这样就
可以了:a = a + ( a++ );
那么由于a++是先把数放到tmp空间再++;
所以,执行顺序:把后面a放进tmp空间,然后
a的存储空间数++,那么现在a中是5,tmp中是4
最后a = a + tmp;所以最终结果==9
*/
a += ( a++ );
printf("a = %d\n\n", a);
/*
解释:这里和上面的区别就是++先后执行的
问题,执行顺序:先a++,那么此时的a中就是
5了,然后将这个结果也放进一个tmp空间,
最后在相加,那么结果就是:5 + 5 == 10
*/
a = 4;
a += ( ++a );
printf("a = %d\n\n", a);
/*
注意:下面的代码编译是通过不了的哦!为什么?
其实自最开始已经解释了!就是有没有tmp的问题!
注意a++是先把a给表达式,再++,那么对于左边
来说,其实给的存储空间是tmp而并不是a本身,对于
tmp来说是不可以被赋值的,只能是作为输入操作!!
所以。。。
*/
/*
a = 4;
(a++) += a;
printf("a = %d\n\n", a);
*/
/*
这个本质其实也是差不多的;
就是先有了++a放到a中了,那么相当于是a的初
始值是5,然后在执行:a += ( a++ );那么结果
就是11呗,呵呵~
*/
a = 4;
( ++a ) += ( a++ );
printf("a = %d\n\n", a);
return 0;
}
run:
g++ -o test test.cpp
./test
但是对于临时空间为什么不可以作为左操作数呢?也就是说为什么不可以赋值呢?查查看~~~
我们必须要知道的临时变量空间对于编译器来说是”未定式“,是不可被赋值的,为了更进一步学习,给两个链接:
1. a++之类问题
2.点击打开链接
昨天偶尔在网上看到一道华为面试题,觉得有点无语,这么NB的公司也出这种没有意义的题目,唉~~~话不多说,贴上代码:
上面还有我自己的解释:
[cpp]
view plaincopyprint?
/*
这个例子主要是考虑到a++和++a的存储问题;
我们知道,对于a++是先将a给表达式再++;
那么这就是需要一个tmp空间来保存++之前
的a!!!但是对于++a是不需要的,因为先
执行++,那么就是直接改a空间内容就好了!
那么我们下面的问题就是这样!
*/
#include <stdio.h>
int main()
{
int a = 4;
/*
解释:下面的答案在Linux和VC下测试是9;
如果这样的形式不好看,那么写成这样就
可以了:a = a + ( a++ );
那么由于a++是先把数放到tmp空间再++;
所以,执行顺序:把后面a放进tmp空间,然后
a的存储空间数++,那么现在a中是5,tmp中是4
最后a = a + tmp;所以最终结果==9
*/
a += ( a++ );
printf("a = %d\n\n", a);
/*
解释:这里和上面的区别就是++先后执行的
问题,执行顺序:先a++,那么此时的a中就是
5了,然后将这个结果也放进一个tmp空间,
最后在相加,那么结果就是:5 + 5 == 10
*/
a = 4;
a += ( ++a );
printf("a = %d\n\n", a);
/*
注意:下面的代码编译是通过不了的哦!为什么?
其实自最开始已经解释了!就是有没有tmp的问题!
注意a++是先把a给表达式,再++,那么对于左边
来说,其实给的存储空间是tmp而并不是a本身,对于
tmp来说是不可以被赋值的,只能是作为输入操作!!
所以。。。
*/
/*
a = 4;
(a++) += a;
printf("a = %d\n\n", a);
*/
/*
这个本质其实也是差不多的;
就是先有了++a放到a中了,那么相当于是a的初
始值是5,然后在执行:a += ( a++ );那么结果
就是11呗,呵呵~
*/
a = 4;
( ++a ) += ( a++ );
printf("a = %d\n\n", a);
return 0;
}
/* 这个例子主要是考虑到a++和++a的存储问题; 我们知道,对于a++是先将a给表达式再++; 那么这就是需要一个tmp空间来保存++之前 的a!!!但是对于++a是不需要的,因为先 执行++,那么就是直接改a空间内容就好了! 那么我们下面的问题就是这样! */ #include <stdio.h> int main() { int a = 4; /* 解释:下面的答案在Linux和VC下测试是9; 如果这样的形式不好看,那么写成这样就 可以了:a = a + ( a++ ); 那么由于a++是先把数放到tmp空间再++; 所以,执行顺序:把后面a放进tmp空间,然后 a的存储空间数++,那么现在a中是5,tmp中是4 最后a = a + tmp;所以最终结果==9 */ a += ( a++ ); printf("a = %d\n\n", a); /* 解释:这里和上面的区别就是++先后执行的 问题,执行顺序:先a++,那么此时的a中就是 5了,然后将这个结果也放进一个tmp空间, 最后在相加,那么结果就是:5 + 5 == 10 */ a = 4; a += ( ++a ); printf("a = %d\n\n", a); /* 注意:下面的代码编译是通过不了的哦!为什么? 其实自最开始已经解释了!就是有没有tmp的问题! 注意a++是先把a给表达式,再++,那么对于左边 来说,其实给的存储空间是tmp而并不是a本身,对于 tmp来说是不可以被赋值的,只能是作为输入操作!! 所以。。。 */ /* a = 4; (a++) += a; printf("a = %d\n\n", a); */ /* 这个本质其实也是差不多的; 就是先有了++a放到a中了,那么相当于是a的初 始值是5,然后在执行:a += ( a++ );那么结果 就是11呗,呵呵~ */ a = 4; ( ++a ) += ( a++ ); printf("a = %d\n\n", a); return 0; }
run:
g++ -o test test.cpp
./test
但是对于临时空间为什么不可以作为左操作数呢?也就是说为什么不可以赋值呢?查查看~~~
我们必须要知道的临时变量空间对于编译器来说是”未定式“,是不可被赋值的,为了更进一步学习,给两个链接:
1. a++之类问题
2.点击打开链接
相关文章推荐
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 关于华为一道面试题 ( ++a )和( a++ )
- 华为面试题——一道关于指针方面的编程题(C/C++)
- 华为面试题——一道关于指针方面的编程题(C/C++)
- Android(java)学习笔记188:关于构造代码块,构造函数的一道面试题(华为面试题)
- (转)关于一道1到N自然数排序的华为面试题
- 关于一道1到N自然数排序的华为面试题
- 关于华为一道面试题 ( ++a )和( a++ )
- 一道华为面试题,关于程序优化的
- 关于一道1到N自然数排序的华为面试题
- 也谈关于一道1到N自然数排序的华为面试题
- 关于一道微软面试题的解答
- 一道关于文件的面试题
- 一道华为面试题的分析(约瑟夫问题)
- 关于一道面试题,使用C#实现字符串反转算法
- 关于 parseInt 的一道有意思的面试题
- 关于一道简单的Java 基础面试题的剖析: short s1=1;s1 = s1 +1会报错吗?
- 知乎上的一篇关于js赋值运算的一道面试题
- 一道关于Iterator的面试题
- 一道关于索引的使用和key_len的计算的面试题