C语言Educoder_普通作业

Educoder普通作业:

补码

十进制数157的16位原码是▁▁▁ ,补码是▁▁▁;十进制数-153的16位原码是▁▁▁,补码是▁▁▁。

对原码从右往左数,直到遇到第一个数字1,1及1右边的数不变,1左边的数字按位求反。

对有符号类型的数,第一位为1代表负数,为0代表正数。

声明

(4) const long y; 是错误的

const 类型名 标识符 =常量

常量类型

0.L 、3.F 是浮点型常量

浮点型常量既可以小数点开头,也可以小数点结尾。
没有后缀时其类型为double,后缀f或F指定float常量,后缀I或L指定long double常量。

1.E-5是浮点型常量

相当于1.0x10^5

0377UL 、 2L是整型常量

后缀ul表示unsigned long,l表示long。注意无后缀时一般表示int。

‘\18’是非法常量
而‘\45’是字符常量

从0到31的字符码和字符码127是控制字符,不可打印,其余为可打印字符。

运算符

  • 在兼有值与赋值功能的表达式中,赋值结合次序是由右至左。
nl=nw=nc=0;
等价于
nl=(nw=(nc=0)) ;

设变量说明为:
int a=1,b=2,c=3,d;
double x=2.0,y=7.7;
分别计算填空题1-9中表达式的值。

d = y += 1/x; d = ▁▁▁
答案为8

注意d是int型,8.2要舍去小数得到8。

设i和j是int类型,a和b是double类型,判断1-10题中表达式的正误。

移位运算

C对unsigned类型就是直接逻辑移位,而对有符号类型左移用逻辑左移(算术左移和逻辑左移是一样的),右移则用算数右移。

  • 正数的移动没什么要注意的。
  • 负数的移位,操作是:求补码→移位→再求补码,公式是:
    -n左移一位是-2n

按位取反

设变量说明为:
unsigned short x=1,y=2,z=4,mask=0xc3,w;
short v;

v =~x ▁▁▁
答案为2

x为无符号短整型,00000000 00000001,
取反,得到11111111 11111110,
此时它是一个负数,需要再求其补码,
得到00000000 00000010,即为2。
负数总是很特殊,需要求补码。

输入和输出

printf

  • %%表示的是百分号本身。

  • 即使浮点常量取得是整型值,在书写时也最好为它加上一个显式的小数点,这样可以强调其浮点性质。

  • char t[100]=hello
    printf("%s",&t[1]) (必须有取址符号)输出的结果是ello

字符串把从第二个字符,一直到串尾的‘\0’打印出来。

&t[1]相当于t+1,意思都是:第一个元素后的1个元素 的地址。

如果是“%c”,只取一个字符。

  • 适合定义简短表达式。* 带参宏定义,注意:完整的括号,宏名和左括号之间不能有空格。
  • 条件编译

    可以在调试程序时跟踪程序的执行

    #define DEBUG
    ...
    #ifdef DEBUG
    	printf("x=%d\n",x);
    #endif
    ...
    #ifdef DEBUG
    	printf("y=%d\n",y);
    #endif
    

指针

对于声明int (*pf(char *))[5];描述正确的是:
pf是一个函数指针,指向的函数的返回值为指向有5个int元素的数组的指针。

int说明数组内是int型元素,*pf 说明返回值是指针,后边的[5]表示指针指向有5个元素的数组。

设p是3个元素的函数指针数组,函数指针数组中每个元素所指向的函数是无参字符指针函数;正确的声明语句为:
B.char *(*p[3])()

char *表示返回值是字符指针,*p[3]说明是含三个指针的数组,后跟()说明指针是函数指针,不带参数。

对于声明int *pf(float(*a)(int));描述正确的是:
pf是一个函数,返回值为int *指针,参数为一个函数指针

根据结合律,pf先和右边的括号结合,因此pf不是函数指针,而是函数。

设p是9个元素的指针数组,数组中每个元素是指向有一个整型参数、返回值为双精度浮点型数的函数的指针;正确的声明语句为:
double (*p[9])(int)

看上边的解析即可。

看指针指向的对象

去掉*p:

  • 比如int **p,可以看作int *(*p),说明 *p指向一个 指向int值的指针。
  • int(p)[3],说明p指向一个 有三个元素的数组。

解释含义问题

方法:从左往右,从里往外。

char *(*p[2])(char *,int)
C语言Educoder_普通作业_第1张图片

  • [ ]的结合性最高,p是个数组,再看星号,星号说明数组内元素的类型。则p是一个包含两个元素的数组,元素的的类型是指针。
  • 右边给出了参数,说明指针的类型是函数指针。则数组p内的指针指向函数。
  • char *说明函数的返回值是字符型指针。

结构

typedef和define的区别

#define STRING char*
typedef char * string;
STRING a,b;
string c,d;

a,c,d都为字符型指针,而b为字符。

结构和指针的求值问题

设有如下声明:

struct T{
     
    int a[3], *pa;
    char b[20], *pb;
}s={
     {
     -1,0,1},s.a,"abcdef",s.b},*ps=&s;

ps->pa[1]++ 0

++前置式才需要加1,后置式不需要加1.

++*++ps->pa 1

ps->pa 访问pa指针,指向数组首元素,自增,指向数组第二个元素,间接访问,值为0,0再自增,值为1

*(++s.pb)+2 d

注意,*p++相当于 *(p++)。
故 * (++s.pb)+2相当于 *((++s.pb)+2)
s.pb为指向字符串首元素的指针,++后指向第二个元素,再加2,指向第四个元素,间接访问,即为d。

(++s.pb)[3] e
++s.pb为第二个元素的地址,后边[3]表示再数三个元素,并间接访问,即访问第五个元素,为e。

你可能感兴趣的:(C/C++)