几个基础性的问题,谢谢

anison 2008-10-26 03:14:01
问题1:
int Vac=3;
int main()
{
int Vac=10;
::Vac++;
cout<<::Vac<<endl;
cout<<Vac<<endl;
return 0;
}

看样子好像::表示全局作用域什么的,请问具体是什么?

问题2:
int k=i+++j;
请问i+++j的运算顺序是什么?为什么?


问题3:
32位机和64位机下数据类型的长度区别?
现在一般都是64位的吗?或者默认就是指64位环境下?

问题4:
异或的运算
用异或实现两个数的交换时会用到a^b^a,表达式结果为b,运算过程看的懂,但是不清楚为什么能这样?
谁能说说其原理,谢谢

问题5:
为什么分配内存时,是从高地址向低地址分配?(按照正常思维,应该是低到高)
比如int i=1; float f=1.23;
i的地址比f的地址要大

抱歉,分太少了
...全文
204 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
anison 2008-11-13
  • 打赏
  • 举报
回复
问题2:
int k=i+++j;
请问i+++j的运算顺序是什么?为什么?

这个还没答出为什么呢,3楼的贪吃原则不对哦
ribut9225 2008-10-27
  • 打赏
  • 举报
回复
学习
太乙 2008-10-27
  • 打赏
  • 举报
回复

问题1:
int Vac=3;
int main()
{
int Vac=10;
::Vac++;
cout < <::Vac < <endl;
cout < <Vac < <endl;
return 0;
}

看样子好像::表示全局作用域什么的,请问具体是什么?

--------------------------------------------
全局作用域描述符
---------------------------------------------


问题2:
int k=i+++j;
请问i+++j的运算顺序是什么?为什么?
------------------------------------
i+j
i=i+1
------------------------------

问题3:
32位机和64位机下数据类型的长度区别?
现在一般都是64位的吗?或者默认就是指64位环境下?

---------------------------------------------
对int等数据类型的浮动~
---------------------------------------------

问题4:
异或的运算
用异或实现两个数的交换时会用到a^b^a,表达式结果为b,运算过程看的懂,但是不清楚为什么能这样?
谁能说说其原理,谢谢
---------------------------------------------
0^1^0=1 0^0^0=0 1^0^1=1 1^1^1=1
--------------------------------------------


问题5:
为什么分配内存时,是从高地址向低地址分配?(按照正常思维,应该是低到高)
比如int i=1; float f=1.23;
i的地址比f的地址要大

-------------------------------
栈的存储

push pop


------低地址

local变量(int i先定义,就先入栈了)
ebp
return返回地址
参数1
.
.
.
参数n-1
参数n
---------高地址
---------------------------------







shuangbi 2008-10-27
  • 打赏
  • 举报
回复
第一个问题:

解答引自MSDN:

You can tell the compiler to use the global identifier rather than the local identifier by prefixing the identifier with ::, the scope resolution operator.


:: identifier
class-name :: identifier
namespace :: identifier


Remarks
The identifier can be a variable or a function.

If you have nested local scopes, the scope resolution operator does not provide access to identifiers in the next outermost scope. It provides access to only the global identifiers.


Example
This example has two variables named amount. The first is global and contains the value 123. The second is local to the main function. The scope resolution operator tells the compiler to use the global amount instead of the local one.


// expre_ScopeResolutionOperator.cpp
// compile with: /EHsc
// Demonstrate scope resolution operator
#include <iostream>

using namespace std;

int amount = 123; // A global variable

int main() {
int amount = 456; // A local variable
cout << ::amount << endl // Print the global variable
<< amount << endl; // Print the local variable
}


dfkjsdhfks 2008-10-27
  • 打赏
  • 举报
回复
学习了.
muyu_baiaixing 2008-10-26
  • 打赏
  • 举报
回复


::作用运算符
用于指定类的静态数据成员
调用全局数据、函数
windows程序中调用系统API

//仅供参考
kiffa 2008-10-26
  • 打赏
  • 举报
回复
补充一下:是c/c++标准要求编译器采取“贪吃”原则来解析,并非所有语言都是如此。
kiffa 2008-10-26
  • 打赏
  • 举报
回复
2,编译器进行词法解析时采用“贪吃”原则,也就是从左向右扫描,直到扫描到一个最长的有意义的记号为止。

因此对 i+++j,从左向右扫描,第一个字符是i,第二个字符是 +,于是把i作为第一个记号,然后继续向右扫描,遇到第2个 +,接下来扫描到第3个 +,由于 ++ 是一个有意义的记号,而 +++ 不是一个有意义的记号,所以编译器会把 ++ 作为第二个记号,依次类推,最后解析为:i ++ + j 这4个记号。

3,标准只规定某种类型的最小范围,以及各种类型之间的关系,比如对于int,标准只规定不能小于为两个字节,并且保证sizeof(shrot) <= sizeof(int) <= sizeof(long),至于具体的实现可以参看<limits>。

4,异或满足交换律,因此a^b^a <=> a^a^b <=> 0^b <=> b

5, 因为堆栈往往实现为从高向低增长,因此对于分配在栈上的变量,其地址是递减的。

第一题这种自己看看书就好了。。。
liumingrong 2008-10-26
  • 打赏
  • 举报
回复
堆是从低到高扩展的

栈是从高到低扩展的
lizhengc 2008-10-26
  • 打赏
  • 举报
回复
::是作用域运算符
lizhengc 2008-10-26
  • 打赏
  • 举报
回复
int k=i+++j;
等价于 k=(i++)+j
因为这种情况c++的原则是尽量取大

anison 2008-10-26
  • 打赏
  • 举报
回复
::可以表示命名空间,还有其他含义吗?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧