C语言的坑

文章目录

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.逗号表达式
  • 7 scanf输入
    • 缓存区
  • 转义字符

1.

#include
int main(){
	int x1 = 28.3%3.1;
	printf("x1 = %d",x1);
	return 0;
} 

% 运算不能有double(float)

2.

#include
int main(){
	int i = 1, j = 1, k =2;
	if ((j++||k++)&&i++){
		printf("%d,%d,%d",i,j,k);
	}

	return 0;
} 

结果:2,2,2

|| 或操作,|| 为界将表达式分为两部分,他会先算前一部分,如果前一部分为真,他将停止运算,如果为假,他才会算第二部分

&&且操作 ,&&为界将表达式分为两部分,他会先算前一部分,如果前一部分为假,他将停止运算,如果为真,他才会算第二部分

3.

i= j = 6

i += j++

i = 12,j = 7

i++,表示先取i的值进行表达式计算或函数调用,最后加法再计算 i=i+1;

++i,表示先加法计算i=i+1,然后在进行表达式计算或函数调用。

4.

a = 1,b = 2,c = 3
if(c>b>a)

= if(0)

c>b 为真,值为1
1>c 为假,值为0
if0

5.

以下合法的C语言赋值语句是?

A.a=b=58 B.k=int(a+b) C.a=58,b=58 D.--i;3

A项 丢失分号

B.k=int(a+b) 改为 k=(int) (a+b); 才对

C. a=58,b=58 改为 int a=58,b=58; 声明加初始化才对

6.逗号表达式

x=5*8, 6+9
 先把 x 赋值为 40,表达式的值为 15

逗号表达式的优先级是最低的 (也就是说赋值运算符 ‘=’ 都比逗号表达式优先级高)。

int a=(2*6,4+8,55);

请问a=?

答:先计算括号内的逗号表达式的值,该逗号的值为55,再把55赋值给a,所以a=55

int a=5;

a=(a=2*3,a*4),a+10;

请问a=?

原来a=24已经完成了计算(此时表达式变成a+10),

之后又算了一步没用的操作。

int a=0,b=0,x=0,y=0;
    //逗号表达式,结合顺序是从左至右,用来顺序求值,
    //完毕之后整个表达式的值是最后一个表达式的值
    
a=(x=7,y=x%5,y+8);//7%5=2,此时y=2了,所以2+8=10  那么a=10

7 scanf输入

#include
int max(int a,int b)

{
	if(a > b)
		return a;
	else
		return b;
}
int main()
{
		int a,b,c;
		scanf("%d %d\n", &a, &b);
		c = max(a, b);
		printf("%d is max\n", c);
		return 0;

}

这个程序是输入两个整数,然后经过比较之后输出最大的数字。但是输入数字后回车无效,并没有打印出结果,这时必须输入字符才能打印出结果。

出现这种情况的原因是,”\n“在scanf()中并不表示等待换行符,而是读取并放弃连续的空白字符。事实上,scanf()格式符中的任何空白字符都表示读取并放弃空白字符,而且诸如"%d"这样的格式也会自动人抛弃前面的空白。因此,”%d\n“中的”\n“会让scanf()读到非空白字符为止,只需要再输入一个非空字符即可。但是如果之后程序还需要读取其他数据进行处理,而程序的使用者并不知情的话,那么就会导致结果并非预想的那样。所以,这时去掉后面的”\n“即可使程序正常运行。

缓存区

缓冲区虽然能够让输入更加方便,但有时也会引发奇怪的问题。例如:

#include 
#include 
int main()
{
	int a=0, b=0;
	scanf("a=%d", &a);
	scanf("b=%d", &b);
	printf("a=%d, b=%d\n", a, b);
	system("pause");
	return 0;
}

运行结果:
a=100↙
a=100, b=0

遇到第一个 scanf(),输入a=100并回车,就会将100赋值给a,并将a=100从缓冲区中删除。遇到第二个 scanf() 时,输入错误

当用户按下回车键时,回车换行符也会被保存到缓冲区,只是大多数情况下 scanf() 会忽略。但是当控制字符串不是以 %xxx 开头时

scanf("b=%d", &b);

回车换行符就起作用了,scanf() 会对它进行匹配,只是匹配失败而已。该例中第二个 scanf() 就是匹配回车换行符失败,所以既不等待用户输入,也不给b赋值。将第二个 scanf() 的控制字符串改成下面的样子:

scanf("%d", &b);

运行结果:
a=100↙
200↙
a=100, b=200

此时 scanf() 就会忽略缓冲区中的回车换行符,等待用户输入。

转义字符

字符集为每个字符分配了唯一的编号,每个字符除了用它本身的实体表示外,还可以用转义字符来表示

2种转义字符:(转义字符的表述范围有限)

1、以"\x"开头(小写的x),后接16进制数(最多2位,即最大\xff

2、以""开头,后接8进制数(最多3位,即最大\777

\ddd ddd表示1~3个八进制的数字(例:\65–A)

\xddd ddd 表示3个十六进制数字(转换为十进制ASSIC码值对应的字符)

错误示例:’\0X41’、’\0x41’、’\X41’、’\c’

你可能感兴趣的:(#,C语言,c语言,开发语言,后端)