首页 > 代码库 > C++进阶
C++进阶
1、
#include <iostream> using namespace std; struct SimpleType { double db; char sz; int n; }; void main() { SimpleType a; int nSize = sizeof(a); cout<<nSize<<endl; } //输出:nSize = 16
解析:这里nSize的值并非13,而是16。这设计结构体的字节对齐问题。编译器在为结构体变量分配空间时,保证下一个成员的偏移量应为该成员数据类型长度的整数倍。首先为db 成员分配空间,假设起始偏移位置从0开始,db 成员将占用0,1,2,3,4,5,6,7共8字节。接下来为成员变量sz 分配空间,由于char 类型占用1字节,sz 将占据8的位置,因为当前位置8与1是整除的。最后为n 成员分配空间,该成员为int 类型,占用4字节。当前偏移位置为9,并不是4的整数倍,因此需要空出3字节(9、10、11),n 从12的位置开始分配4字节的空间。这样就导致了实际分配的大小与“理论上”的大小不一致。
2、
#include <iostream> using namespace std; void OutputString(char data[]) { int iSize = sizeof(data); cout<<"iSize = "<<iSize<<endl; } void main() { int iLen = sizeof("家园"); cout<<"‘家园‘的大小为:"<<iLen<<endl; OutputString("家园"); } //输出: //‘家园‘的大小为:5 //iSize = 4
解析:作为参数传递的数组其实是以指针的形式传递的,所以在使用sizeof获得数组参数的长度时是4,而不是数字长度。
3、
#include <iostream> using namespace std; void main() { int i = 2; cout<<(i = 3 * 5, 2 * 4)<<endl; cout<<i<<endl; int x = 9, y = 7; int n = x > y ? (x-y):(x+y); //三目元表达式 cout<<n<<endl; } //输出: //8 //15 //2
解析:因为赋值运算符的优先级比逗号运算符的优先级高,所以在上面的代码中,会先计算赋值表达式的值,也就是i=3*5,然后再计算逗号表达式的值,所以 i 的值为15,而逗号表达式的值却是8.
又因为条件运算符的优先级高于赋值运算符,所以会先计算 x>y 的值,然后执行符合条件的表达式(x-y),最后将结果赋值给n。
4、
C++进阶
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。