• 语法面试等题目汇总


    #define area(x) x*x
    这在使用中是很容易出现问题的,看如下的程序
    void main()
    {
    int y=area(2+2);
    printf(“%d”,y);
    }
    按理说给的参数是2+2,所得的结果应该为4*4=16,但是错了,因为该程序的实际结果为8,仍然是没能遵循纯粹的简单替换的规则,又是先计算再替换 了,在这道程序里,2+2即为area宏中的参数,应该由它来替换宏定义中的x,即替换成2+2*2+2=8了。那如果遵循(1)中的解决办法,把2+2 括起来,即把宏体中的x括起来,是否可以呢?#define area(x) (x)*(x),对于area(2+2),替换为(2+2)*(2+2)=16,可以解决,但是对于area(2+2)/area(2+2)又会怎么样 呢,有的学生一看到这道题马上给出结果,因为分子分母一样,又错了,还是忘了遵循先替换再计算的规则了,这道题替换后会变为 (2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除运算规则,结果为16/4*4=4*4=16,那应该怎么呢?解决方法是在整个 宏体上再加一个括号,即#define area(x) ((x)*(x)),不要觉得这没必要,没有它,是不行的。

    两个数交互数据,不用第三个变量

    三个数如何比较大小最简洁:

    max=a>b?(a>c?a:c):(b>c?b:c);

    怎么用指针判断一个字符串是否是回文:

    #include <string.h>

    char str[10];
    gets(str);
    int len = strlen(str); 求char数组的长度

    结构体

    原文http://www.xuebuyuan.com/2210088.html

    1、结构体成员名可以与程序中名称相同,两者代表不同的对象。

    2、结构体变量做函数参数时是值传递。

    3、成员的引用形式为结构体变量.成员名结构体指针变量->成员名(*结构体指针变量).成员名

    4、结构体成员在内存中顺序存放,但是结构体成员的内存分配却不一定是连续的(跟对齐方式有关,详见结构体内存分配分析)。

    程序员面试宝典上一道题目

    看下面这道题目,找出其中的3个错误,并且写出其输出值。
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    using namespace std;
    struct S
    {
    	int i;
    	int *p;
    	float t1;
    	char t2;
    	char t3;
    };
    void main()
    {
    	S s;
    	cout<<sizeof(s)<<endl;					//1  
    	int *p=&s.i;
    	p[0]=1;
    	p[1]=5; 
    	p[2]=66;
    	p[3]=65;	
    	p[4]=67;						//2  
    
    	cout<<&p<<" "<<p<<" "<<*p<<endl;			//3 
    	cout<<p[0]<<" "<<s.i<<endl;				//4
    	cout<<&p[0]<<" "<<&s.i<<endl;				//5
    	cout<<p[1]<<" "<<s.p<<" "<<endl;			//6
    	cout<<&p[1]<<" "<<&s.p<<" "<<&s.p[0]<<" "<<endl;	//7
    	cout<<s.p[0]<<" "<<*s.p<<endl;				//8
    
    	s.p=p;
    	s.p[1]=1;
    	s.p[0]=2;						//9
    	system("pause");
    }
    
    
    

    代码注释

    //1  根据对齐方式,可以得到所占空间大小
    //2  虽然结构体有5个成员变量,但并能表示可以使用指针给5个内存地址赋值,因为每个变量所占空间和使用指针表达出的空间大小不一定相同。例如s.t2在内存中只占一个字节,而p[3]在内存中占4个字节。指针变量p指向结构体变量成员s.i,由于现在程序总共申请的空间大小为sizeof(s),所以当使用指针给未申请的空间赋值时,程序出错。
    //3  &p表示指针变量p自身的地址,p表示所指向内容的地址,*p表示所指向的内容
    //4  p[0]表示地址(p+0)中的内容,也就是*(p+0)
    //5  &p[0]表示地址(p+0*sizeof(int*))
    //6  p[1]表示地址(p+1)中的内容,也就是*(p+1)     注:这个“1”并不是1个字节,而是1个int*类型所占的空间的字节数,即sizeof(int*)
    //7  &s.p[0]表示指针变量s.p所指向的内容的地址,也就是s.p变量自身所存储的值。即&s.p[0]==s.p
    //8  出错,因为此时并未给地址0x00000005赋值,所以不能访问此地址中的内容。
    //9 出错,因为s.p[1]=1已经把s.p指向的地址更改为了0x00000001,对一个未作声明的地址直接进行访问会出错。

    二、VC++中的结构体分析
       C语言提供了一种称为结构体的数据类型,它可以将不同类型的数据组合成一个有机整体,这样不但便于引用,而且很清楚地反映出各数据项之间的内在联系,因而在C语言中结构体得到广泛的应用。正如我们已经熟知的那样,在C语言中,结构体的长度等于各数据项长度之和,而且结构体的长度与数据项在其中的位置顺序无关。例如,在TurboC中运行上述两个例子中的程序,得到的结果都是the size of the struct=7。这是由于char数据类型的长度是1,long数据类型的长度是4,而short int数据类型的长度是2,从而得到1+2+4=7。
      那么为什么上述两个例子在VC++环境下所得的结果各不相同并且均不是7呢?在实际应用中,我们发现VC++中为结构体变量分配内存时与C语言不同:VC++中为结构体分配内存时,先分配一单位长度(该单位长度的大小等于结构体中占内存最多数据类型,如struct2的单位长度为数据类型long的长度4。),然后在该单位长度中依次为结构中的变量分配空间,直至该单位空间不能再分配完一个完整的变量时为止,就再为该结构体分配另一个单位长度的存储空间。如结构体struct2:首先,分配4个字节,p1占1个字节后,剩余的3个字节不足以分配p3,于是,系统为struct2再分配4个字节分给p3,接着下4个字节分给p2,把以,struct2共有4+4+4=12个字节。再如结构体struct1:同样先分配4个字节,p1占1个字节后,还可为p2分配2个字节,显然剩余的1个字节不足以为p3分配空间了,因此系统还要再为该结构体分配4个字节,该4个字节恰好是p3所需的,所以struct1共有4+4=8个字节。
      至此我们便不难理解上述两个例子中的结果是如何算出来的。其中,例1中是4+4=8,而例2中是4+4+4=12。
  • 相关阅读:
    delphiXE7关于android 检测屏幕是否处于关闭状态
    delphiXE7关于android API的使用和检测WIFI状态的问题
    关于Android下Delphi XE7获取通讯录的问题
    多线程操里操作webbrowser的 Frames
    关于游戏引擎
    今天博客开通了
    集合类型-集合
    编程语言
    live Python4笔记
    live Python3笔记
  • 原文地址:https://www.cnblogs.com/zhizhan/p/4559106.html
Copyright © 2020-2023  润新知