错题更正~(摘抄为主

1、c语言整份代码的入口是main函数

2、

#define a 1+2

定义的是字符串,不能说a就等于3

摘抄别人的段落:

#define N 2+2 

         void main() 

         { 

            int a=N*N; 

           printf(“%d”,a); 

         }

出现问题:在此程序中存在着宏定义命令,宏N代表的字符串是2+2,在程序中有对宏N的使用,一般同学在读该程序时,容易产生的问题是先求解N为 2+2=4,然后在程序中计算a时使用乘法,即N*N=4*4=16,其实该题的结果为8,为什么结果有这么大的偏差? 

问题解析:如1节所述,宏展开是在预处理阶段完成的,这个阶段把替换文本只是看作一个字符串,并不会有任何的计算发生,在展开时是在宏N出现的地方 只是简单地使用串2+2来代替N,并不会增添任何的符号,所以对该程序展开后的结果是a=2+2*2+2,计算后=8,这就是宏替换的实质,如何写程序才 能完成结果为16的运算呢? 

解决办法:将宏定义写成如下形式 

    #define N (2+2) 

    这样就可替换成(2+2)*(2+2)=16

3、如果一个自动变量被编译器分配到CPU内部的寄存器存储对这个变量使用&运算符取地址往往是无意义的,因为在许多机器的硬件实现中,并不为寄存器指定与外部存储器统一编址的地址。由于寄存器变量的分配是由编译器自动完成的,程序员在写程序是并不能保证所声明的变量是不是会自动的被分配到寄存器中,所以不要对自动变量进行取地址操作是最安全的做法。

4、

main() {
  int a=5,b=4,c=3,d=2;
  if (a>b>c) 
	  printf("%d\n", d); 
  else if ( (c-1 >= d) ==1) 
	  printf("%d\n", d+1); 
  else
	  printf("%d\n", d+2);
}

a<b<c被解释成:(a<b)<c,如果(a<b)成立,则(a<b)等于1,否则等于0

所以结果是3

5、int a=1,b=2,c=3,d=4,m=2,n=2;
     (m=a>b)&&(n=c>d);

"&&"为逻辑与运算符(左右均为正才为真),具有左结合性(从左往右),题目中(m=a>b)结果为m=0,答案为零,所以结果为假。逻辑与运算符具有“若左边判定为假,则结果为假,不再进行后续判断”。所以(n=c<d)并未执行,所以n=2

int  i=1, j=1, k=2;
	if ( (j++ || k++) && i++)   
	printf("%d,%d,%d\n", i, j, k);

同理,“||"符号(左右有一个为真即可)也为左结合性,左侧 j++ 与右侧 i++ 相等,结果为真,不再执行 k++,故输出结果为2 2 2.

6、++、-- 与<、>混合时要注意优先顺序

int x;  
	scanf("%d",&x); //假设输入5
	if(x--<5)   //此时x=5!不是4!不是4!
			printf("%d",x); 
	else   
			printf("%d",x++);//跳到此步:执行x--后x=4
return 0;//此时为执行x++后,x=5!
if(n++<10)     //输入n=9,先判断n小于10,再让n+1==10
	printf ("%d\n",n); else  //输出n=10
	printf("%d\n",n--);  

7、case后面可以跟N个语句

8、if语句中,条件表达式不只是关系表达式或逻辑表达式,还能是数值表达式,如if(a)

9、(条件表达式) ? (结果1) : (结果2)   

条件运算符是唯一的三目运算符,其优先级低于所有其他运算符,赋值运算符 = 除外,结合方向是自右至左。

10、case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。常量表达式只能是整型、字符型或枚举型常量的一种。

default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。

多个case可以共用一组执行语句块

11、printf控制位数:

d 格式,用来输出十进制整数。

  • %d:按整型数据的实际长度输出;
  • %md:m为指定的输出宽度。如果数据的位数小于m,则左端补空格;若大于m,则按实际位数输出;
  • %0md:同上,但这里如果数据的位数小于m,则左端补0;若大于m,则按实际位数输出。

f 格式,用来输出小数。

  • %f:整数部分全部输出,并输出6位小数;
  • %.nf:整数部分全部输出,并输出n位小数;
  • %m.nf:输出共占m列,n位小数,若数值宽度小于m则左端补空格。

s 格式,用来输出字符串。

  • %s:输入全部字符串;
  • %ms:输出的字符串共占m列,若字符串本身的长度小于m,则左补空格;若字符串本身的长度大于m,则全部输出。

12.取模:%

不要对浮点数使用该运算符,那将是无效的。

 如果第一个操作数为负数,那么得到的模也为负数;如果第一个操作数为正数,那么得到的模也为正数。

取模公式:a % b == a - (a/b) * b

——用整形的a除以2.0得到的还是整数www

——位运算的优先级:由高到低的顺序是:~ → << 、>> → & → | → ^

13.对于 int 型, 13! 会溢出
对于 long long 型,21!会溢出

14.

  • 形参在函数中是变量名,在函数调用时,形参被临时分配相应的内存,调用结束后,形参单元被释放,而实参单元保留并维持原值。
  • 实参是表达式,负责向对应的形参标识的内存单元传递数据,实参向形参的数据传递是“值传递”。
  • 实参与形参必须个数相同
  • 对应的形参和实参的类型必须一致
  • “函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。”
  • 函数返回值在寄存器中, 没有地址, 不能作为形参,但可以作为实参

15. 用户标识符:用户根据需要自己定义的标识符。一般用来给变量、函数、数组等命名。用户标识符如果与关键字相同,则编译时会出错;如果与预定义标识符相同,编译时不会出错,但预定义标识符的原意失去了,或会导致结果出错,因此预定义标识符一般不用来作为用户标识符。

 16.主函数
1)main是主函数名,C语言规定必须用main作为主函数名
2)主函数后的一对括号中间可以是空的,但这一对括号不能省略。
3)一个C程序可以包含任意多个不同名字的函数,但必须有且只有一个主函数。
4)C程序的运行总是从主函数开始执行。

main不是关键字、保留字,但也不能做标识符。

17.在C语言中定义函数后,在使用前,需要在main函数前进行声明,否则会报错。

或者将函数定义在main函数的前面,则不需要声明。

18.不同函数中可以使用相同名字的变量,它们代表不同的变量,互不干扰。

在一个函数内部,可以在复合语句中定义变量,这些变量仅在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。

19.一个C源程序是由一个main函数和若干个其他函数组成的。函数是C程序的基本单位,被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己定义的函数。

在C语言中,不能存在过程的概念。

在C语言中,函数允许单独编译,可以为单独文件形式存在。

20.全局变量的弊端 增加内存开销 降低函数的通用性

21.

1、以下叙述正确的是( B )

A)C语言的源程序不必通过编译就可以直接运行。

B)C语言中的每条可执行语句最终都将被转换成二进制的机器指令。

C)C语言源程序经编译形成的二进制代码可以直接运行。

D)C语言中的函数不可以单独进行编译。

2、一个C语言的源程序中( A )

A)必须有一个主函数

B)可能有多个主函数

C)必须有除主函数外其它函数

D)可以没有主函数

3、以下不能定义为用户标识符的是( D )

A)scanf B)Void C)_3com D)int

4、若以下选项中的变量已正确定义,则正确的赋值语句是( C )

A)x1=26.8%3; B)1+2=x2; C)x3=0x12; D)x4=1+2=3;

5、设有定义:float a=2,b=4,h=3;以下C语言表达式中与代数式的计算结果不相符的是( B )

A)(a+b)*h/2 B)(1/2)*(a+b)*h C)(a+b)*h*1/2 D)h/2*(a+b)

22.main函数可以被递归调用(c语言中)

23.

先定义int n = 5;
再定义int a[n] = {0};
编译怎么不通过啊?
 
n必须为常量
如果想实现你说的,应该用宏。
#define n 5
int a[n]={0};
这样就可以了。
你如果非要n的。可以用动态申请长度为n的数组,
int n=5;
int *a=new int[n];
然后对数组赋值。
a[0]=0; 

补充下:
如果你写的C++,可以用
const int n = 5;
int a[n]; 
但是这种写法,在C中是不可以使用的。

24.

char s[5]="asdf";
这句不是赋值而是初始化;
讲的赋值语句是在程序执行中的赋值,就像
int a;
int b;
b=a;  这是赋值;
对于字符而言,要赋值就要采用strcpy(s1,s2)这个函数。

25.C语言中\既是接续符也是转义字符。

接续:编译器将反斜杠去除,然后把反斜杠后面的和下面那一行原封不动的接上来。

所以在接续单词的时候下一行不能有空格,反斜杠后面也不能有空格。

转义:

当反斜杠\作为转义字符使用时必须在单引号或双引号之间。

以下程序段的输出结果是 A) 9 B) 12 C) 13 D) 14
char s[]="\\141\141abc\t";
printf ("%d\n",strlen(s));

\\算一个转义字符,代表一个反斜线字符
1算一个字符
4算一个字符
1算一个字符
\141算一个转义字符
a算一个字符
b算一个字符
c算一个字符
\t算一个转义字符,代表横向跳格

问1 char *s="\ta\017bc"中指针变量s 指向的字符串所占字节数是6的原因。

问2 char *s="\ta\018bc";

    for(;*s!='\0';s++)

       printf("*"); 的循环次数是6的原因。 

答1  '\t' 是一个转义字符 相当于键盘“Tab”键
  ‘a’ 普通字符
   '\017'转义字符 ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么符号)
  ‘b’ 普通字符
  ‘c’ 普通字符  
   然后再加一个字符串结束标志‘\0’所以指针变量s 指向的字符串所占字节数是6
答2 循环次数应该是6次吧??因为"\ta\018bc"中有六个字符加'\0'占7个字节,循环条件是*s!='\0',所以应该是循环6次!
其中 '\01'转义字符, soh . ASCII代码值为8进制数1即10进制数1的那个符号
千万不要理解'\018'为1个转义字符,因为018不是一个正确的8进制数(只能出现0~7的数码符号)

26.

char c = 1 表示ASCII码=1的字符

char c = "1" 语法错误

char c = '1' 表示1这个字符

27.不可以用关系运算符对字符数组中的字符串进行比较!

但是可以比较普通字符串

对两个字符串运用关系运算符,许多人认为小于表示“在字母顺序上靠前”,大于表示“在字母顺序上靠后”,但是事实并非如此。对于字符串,第一个字符串中的每个字符的代码都会和第二个字符串中对应位置上的字符的代码进行比较。完成这种比较操作后,会返回一个Boolean值。问题在于大写字母的代码都小于小写字母的代码,这就意味着可能会遇到下面这种情况:

var bResult = "Brick" < "alpha";

alert(bResult);// output:true;

在这个例子中,字符串“Brick”小于字符串“alpha”,因为字母B的字符代码是66,字母a的字符代码是97。要强制得到按照字母顺序比较得到的结果,必须把两个运算数转换成相同的大小写形式(全大写或者全小写)然后在尽行比较。例如:

var bResult = "Brick".toLowerCase() < "alpha".toLowerCase();

alert(bResult);// output:false;

另一种棘手的情况发生在比较两个字符串形式的数字的时候,例如:

var bResult= "23" < "3";

alert(bResult);//output:true;

因为这两个运算时都是字符串,因此将比较他们的字符代码(”2“的字符代码是50;”3“的字符代码是51)因此输出true;

不过把上述例子中的其中一个运算符改为数字的时候,那么就有趣了,例如:

var bResult= "23" < 3;

alert(bResult);//output:false;

如论合适比较一个字符串数字和一个数字,ECMAscript都会把字符串的数字转化为数字,然后在比较大小。

不过,如果字符串不能被转化成数字的时候,又该怎么办呢?

var bResult= "a" < 3;

alert(bResult);//output:false;

字母a不能换转成有意义的数字,不过调用parseInt()方法,返回的是NaN,根据规则,任何包含NaN的关系运算都要返回false,因此这段代码也输出false;

var bResult= "a" < 3;

alert(bResult);//output:false;

通常,如果小于运算的两个值返回false,那么大于等于运算必须返回true;不过如果某个数字是NaN,则情况并非如此。

28.

int *p()是返回指针的函数

int (*p)()是指向函数的指针

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值