C语言小细节

1.scanf函数的返回值

通常我们在使用scanf输入数据时,并不会用到scanf函数的返回值,但其实scanf函数是有返回值的。

#include<stdio.h>
int main() 
{
	int a,b,c;
    a = b = c = 0;
	int ret = scanf("%d%d%d",&a,&b,&c);
	printf("ret = %d\n",ret);
	printf("a = %d,b = %d,c = %d",a,b,c);
	return 0;

	
}

所谓的返回值是一个整数,表示成功读取的变量个数

如果没有读取任何项,或者匹配失败,则返回 0

如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF-1)。

ctrl+z 可以让scanf返回-1。

2.if 的判定

(1)如下代码:

#include<stdio.h>

int main() 
{
	int i = 0,a = 0,b = 2, c = 3,d = 4;
	i = a++ && ++b && d++;
	printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
	return 0;	
}

运行结果:

为什么b与d没有加1呢,其实是因为a后增,先赋值等于0,再自增等于1。

&&识别到非真退出判定,没有进行后面的操作。

(2)如下代码:

#include<stdio.h>
int main() 
{
	int i = 0,a = 0,b = 2, c = 3,d = 4;
	i = ++a && ++b && d++;
	printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
	return 0;	
}

如果a是前置增量,那么b与d就发生变化了。

(3)如下代码:

#include<stdio.h>
int main() 
{
	int i = 0,a = 0,b = 2, c = 3,d = 4;
	i = ++a || ++b || d++;
	printf(" a = %d\n b = %d \n c = %d\n d = %d\n",a,b,c,d);
	return 0;	
}

那么为什么这段代码中b与d又不变了呢?

是因为 || 操作符,当其中一个表达式为真(非零)时,整个表达式的结果为真。为真则退出判定

3.赋值忽略符

当我们输入年月日等习惯加格式的代码时,可能会出现这种问题:

#include<stdio.h>
int main() 
{
	int year,month,day;
	year = month = day =0;
	scanf("%d%d%d",&year,&month,&day);//输入年月日
	printf("%d-%d-%d",year,month,day);
	return 0;	
}

那么怎么解决呢?在输入时不添加格式?难免有点别扭,此时我们就应用到一个少用的操作符

%*c:

#include<stdio.h>
int main() 
{
	int year,month,day;
	year = month = day =0;
	scanf("%d%*c%d%*c%d",&year,&month,&day);
	printf("%d-%d-%d",year,month,day);
	return 0;	
}

该占位符就不会返回值,解析后就会被丢弃。

4.

最小宽度和小数位数这两个限定值,都可以用*来代替

#include<stdio.h>
int main() 
{
	printf("%*.*f",6,2,1111.4);
	return 0;	
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值