文章目录
关于C的一些较为特殊的语法
语句块
- 写在一个大括号中的所有语句,称为一个语句块。通常用在
if、循环等语句之后,当之后只有一条语句时,可省。 - 特殊的,它几乎可以写在任何地方,但作用范围被限制,只在语句块中生效:
 
    int a = 1;
    {
        int a = 2;
        printf("%d\n", a);  
    }
    printf("%d\n", a);
 
如去掉大括号,将会编译错误。
    int a = 1;
    int a = 2;
    printf("%d\n", a);
    printf("%d\n", a);
 
printf 与 三元表达式 的配合使用
对于平时的一些需求,想判断根据不同的结果,输出不同的数据,于是也许会有了以下的代码:
if(i>0)
    printf("%d大于0",i);
else
    printf("%d小于或等于0",i);
 
为了仅仅一个功能,实在太繁琐了,实际printf支持以下语法,利用三元表达式,代码便能简洁很多了。
    printf("%d", 1 > 0 ? 1 : 0);
    printf(1 < 0 ? "%d" : "%c", 65);
 
printf 的执行顺序
int a = 1;    
printf("%d,%d,%d\n", a, a + 1, a++);
 
- 若按自左向右执行,应输出: 
1,2,1 - 但实际却输出: 
2,3,1 
    int a = 1;
    printf("%d,%d,%d\n", a = a + 1, a + 1, a);
 
- 得出自右向左输出后,再猜测这个输出为:
2,2,1 - 而实际却是:
2,2,2 - 原因: 对于变量a , 应是所有表达式全部执行完成后,一起打印出来。而不是一个一个打印。
 - 所以对于
a=a+1、a类似的表达式,将会被打印统一相同的值,它的值就是自右向左执行完所有表达式后,变量a的值。 - 而对于类似于
a+1的表达式,并不会打印变量a的值,它没有赋值给a变量,只能当做一个常量去打印。 
printf的返回值
举个栗子:
printf("%d-%d-%d-%d-%d", printf("1"),printf("22"),printf("333"),printf("4444"),printf("55555"));
 
- 输出结果: 
5555544443332211-2-3-4-5 - 根据输出结果,也证明了printf函数是自右向左执行,先输出了
555554444333221,再输出了printf的返回值, 分别是1-2-3-4-5,根据printf函数中的参数,很容易发现规律找出printf的返回值:打印字符的个数。 
if中的条件判断
- 对于 
if语句里的条件表达式, 有很多种表达的方式,方法不一,但使用相同。例:i!=0便可直接写为一个i,也可以有相同效果,且更简洁。因为C语言中规定,以数值0表示"假",其余皆表示为“真”。但是注意0的不同表示形式,字符'\0'、NULL皆表示数值0,但是字符零'0',并不表示数值0,在ASCII码中,字符零以数值48表示。 - 所以以下的表达式都不执行
 
if(0)
    printf("0");
if('\0')
    printf("\'\\0\'");
if(NULL)
    printf("NULL");
 
if与else的配对问题
else只与前 最近 未匹配对 的if配对,一对一。注意三个点:1、在else之前;2、离else最近;3、未配对的if。- 与缩进无关!!!这不是Python。
 
switch中的break
- 基本语法: 一般形式
 
switch(express) {
    case 1:
		printf("1");
		break;
	case 2:
		printf("2");
		break;
	case 3:
		printf("3");
		break;
	default
        printf("default");
}
 
express应是一个整形表达式,case所选择的值,只能为常量,注意:字符也属于整形,且case的值互斥。- 当第一个case的值成功与表达式匹配后,执行其
case后的语句,再由break跳出,不再执行后面语句。 
switch (express){
    case 1:
    case 2:
        printf("2");
    default:
        printf("default");
    case 3:
        printf("3");
        break;
    }
 
- 较为特殊的,
break可省,case后可无语句,语句可省,default语句位置任意。但是,如果default前有case的值匹配,将会继续向后执行default语句中的内容,default的语句也不再是无值匹配时,才执行了。 - 对于所有
case中的语句,有两种将会被执行的情况:1、case的值与表达式匹配;2、当前case之前的case语句的值与表达式相匹配,执行之前的语句中未有break跳出switch; - 对于default语句也是有两种将会被执行的情况:1、所有的case都不匹配与表达式的值;2、之前的case语句的值与表达式相匹配,执行之前的语句中未有
break跳出switch; - 如
switch在循环语句中,在switch中的break只对switch生效,无法跳出循环。 
for循环默认值
- C语言中,一共有3个循环语句,其中
while与do……while必须中必须带有表达式,而for循环中可省为空。但是for循环中的分号不能省! - 无限循环写法:
 
for(;;)
    printf("for中表达式如不写默认为'真'");
 
- 几乎所有情况下,三种循环都可以相互替换使用。根据实际需求一般选择较为简洁的一种。
 
define 宏定义
- define只是简单地字符替换,特别注意有无括号的区别。
 - 可以嵌套,可以带参数,可以是一个语句。
 
                    
                
                
            
        
浙公网安备 33010602011771号