• 一些C代码


     1 #include <stdio.h>
     2 
     3 void foo(void)
     4 {
     5     unsigned int a = 6;
     6     int b = -20;
     7     (a+b>6)?puts(">6"):puts("<6");
     8 }
     9 
    10 int main(void)
    11 {
    12     foo();
    13     return 0;
    14 }

    运行结果:

    >6

    a+b做了隐式转换,把int转化为unsigned int。编译器就会把b当做一个很大的正数。

    下面代码有什么问题,为什么?

     1 #include <stdio.h>
     2 
     3 void foo(void)
     4 {
     5     char string[10],str1[10];
     6     int i;
     7     for(i=0;i<10;i++)
     8     {
     9         str1[i]='a';
    10     }
    11     strcpy(string,str1);
    12     printf("%s",string);
    13 }
    14 
    15 int main(void)
    16 {
    17     foo();
    18     return 0;
    19 }

    运行到11行strcpy的时候,可能会产生内存异常。

    因为str1没有结束标志符。str1数组后面继续存储的可能不是'',而是乱码。

    printf函数,对于输出 char * 类型,顺序打印字符串中的字符,知道遇到空字符'',或已经打印了由精度指定的字符数为止。

    3. 下面代码,i和j的值分别是什么?为什么?

     1 #include <stdio.h>
     2 
     3 static int  j = 0;
     4 int k = 0;
     5 
     6 void fun1(void)
     7 {
     8     static int i = 0;
     9     i++;
    10 }
    11 
    12 void fun2(void)
    13 {
    14     j=0;
    15     j++;
    16 }
    17 
    18 int main(void)
    19 {
    20     for(k=0;k<10;k++)
    21     {
    22         fun1();
    23         fun2();
    24     }
    25     return 0;
    26 }

      i=10,j=1。

      由于被 static 修饰的局部变量总是存在内存的静态区,所有即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时扔能用到这个值。所以i的值只被初始化了1次。

      而j是全局变量,每次调用函数时,j的值都被初始化。

    4. 下面代码里,假设在32位系统下,各个sizeof计算的结果分别是什么?

     1 #include <stdio.h>
     2 
     3 int *p = NULL;
     4 
     5 int a[100]={0,};
     6 
     7 int b[100]={0,};
     8 void fun(int b[100])
     9 {
    10     printf("sizeof(b)=%d
    ",sizeof(b));
    11 }
    12 
    13 int main(void)
    14 {
    15     printf("sizeof(p)=%d
    ",sizeof(p));
    16     printf("sizeof(*p)=%d
    ",sizeof(*p));
    17     printf("sizeof(a)=%d
    ",sizeof(a));
    18     printf("sizeof(a[100])=%d
    ",sizeof(a[100]));
    19     printf("sizeof(&a)=%d
    ",sizeof(&a));
    20     printf("sizeof(&a[0])=%d
    ",sizeof(&a[0]));
    21     fun(a);
    22 }

    32位 decpp运行结果:

    sizeof(p)=4
    sizeof(*p)=4
    sizeof(a)=400
    sizeof(a[100])=4
    sizeof(&a)=4
    sizeof(&a[0])=4
    sizeof(b)=4

    注意:在VC++6.0中  sizeof(&a)=400。

    64位 devcpp运行结果:

    sizeof(p)=8
    sizeof(*p)=4
    sizeof(a)=400
    sizeof(a[100])=4
    sizeof(&a)=8
    sizeof(&a[0])=8
    sizeof(b)=8

    5. 下面代码结果是什么?为什么?

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main(void)
     5 {
     6     signed char a[1000];
     7     int i;
     8     for(i=0;i<1000;i++)
     9     {
    10         a[i]=-1-i;
    11     }
    12     printf("%d
    ",strlen(a));
    13     return 0;
    14 }

      输出结果:255

        

    6. 下面代码中,哪些内容可以被改写,哪些不可被改写

    1 const int *p;
    2 int const *p;
    3 int *const p;
    4 const int const *p;
    const int *p;        //p可被改写,p指向的对象不可被改写 
    int const *p;        //p可被改写,p指向的对象不可被改写 
    int *const p;        //p不可被改线,p指向的对象可被改写 
    const int const *p;  //指针p和p指向的对象都不可被改写 

     8. 在32位x86系统下,输出的值为多少?

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main(void)
     5 {
     6     int a[5]={1,2,3,4,5};
     7     int *ptr1 = (int *)(&a+1);
     8     int *prt2 = (int *)((int)a+1);
     9     printf("%x,%x
    ",ptr1[-1],*prt2);
    10     return 0;
    11 }

    输出: 5,2000000 

    32位x86存储是小端模式。

    ptr1指向数组后面的地址,ptr[-1]则执行a[4].

    prt2指向数组a第一个元素的地址值再+1字节的地址。

    数组a:低地址 01000000 02000000 03000000 04000000 05000000

            |                                                               |                |

             ptr2                ptr1-1  ptr1

     9. 0x01<<2+3 的值是多少?为什么?

      32,因为+的优先级比移位运算符的优先级高

    10. 定义一个宏,求x的平方。

    #define POW(x) ((x)*(x))

       注意括号

    11.下面两个代码有什么区别?

     1 struct TestStruct1{
     2     char c1;
     3     short s;
     4     char c2;
     5     int i;
     6 }st1;
     7 
     8 
     9 struct TestStruct2{
    10     char c1;
    11     char c2;
    12     short s;
    13     int i;
    14 }st2;

      sizeof(st1)=12, 占12字节内

      sizeof(st2)=8,占8字节内存

                                          

     12. 写代码,想内存0x12ff7c地址处存入一个整形术0x100。

    int *p = (int *)0x12ff7c;
    *p = 0x100;

    或者

    *(int*)0x12ff7c = 0x100;

    13. 下面代码值是多少?

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 int main(void)
     5 {
     6     int a[5]={1,2,3,4,5};
     7     int *ptr = (int *)(&a+1);
     8     printf("%d,%d
    ",*(a+1),*(ptr-1));
     9 
    10     return 0;
    11 }

    结果为: 2,5 

     a作为右值,与&a[0] 一样,表示数组第一个元素的地址,*(a+1) 表示 a[1]

    而 &a,表示数组的地址,&a+1,指针指针移动的大小为整个数组大小 5*sizof(int)个字节。*(ptr-1) 表示a[4]。

    enum

     1 #include <stdio.h>
     2 
     3 enum Color
     4 {
     5     GREEN = 1,
     6     RED,
     7     BLUE,
     8     GREEN_RED=10,
     9     GREEN_BLUE
    10 }ColorVal;
    11 
    12 int main(void)
    13 {
    14     printf("sizeof(ColorVal)=%d
    ",sizeof(ColorVal));
    15     printf("GREEN=%d
    ",GREEN);
    16     printf("RED=%d
    ",RED);
    17     printf("BLUE=%d
    ",BLUE);
    18     printf("GREEN_RED=%d
    ",GREEN_RED);
    19     printf("GREEN_BLUE=%d
    ",GREEN_BLUE);
    20     return 0;
    21 }

    运行结果:

    sizeof(ColorVal)=4
    GREEN=1
    RED=2
    BLUE=3
    GREEN_RED=10
    GREEN_BLUE=11

    enum变量类型可以给其中的常量符号赋值,如果不赋值则会从被赋初始值的那个常量开始依次+1;如果都没有赋值,它们的值从0开始依次+1。

  • 相关阅读:
    什么是API
    Maxiee的Vim入门日记(4)——安装windows下的Cscope
    将字符串变成大写----C++实现
    POJ 3254 炮兵阵地(状态压缩DP)
    UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图
    CRC 模式及实现
    [HDU 1317]XYZZY[SPFA变形][最长路]
    poj 2155 Matrix
    [置顶] Application,Session,Cookie之Application对象
    [Todo] Java及C++ Exception整理
  • 原文地址:https://www.cnblogs.com/doitjust/p/11521122.html
Copyright © 2020-2023  润新知