【关于C的一些较为特殊的语法】

Posted on 2022-11-24 21:20  梦中千秋  阅读(111)  评论(0编辑  收藏  举报

关于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 = 1printf("%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+1a 类似的表达式,将会被打印统一相同的值,它的值就是自右向左执行完所有表达式后,变量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个循环语句,其中whiledo……while必须中必须带有表达式,而for循环中可省为空。但是for循环中的分号不能省!
  • 无限循环写法:
for(;;)
    printf("for中表达式如不写默认为'真'");
  • 几乎所有情况下,三种循环都可以相互替换使用。根据实际需求一般选择较为简洁的一种。

define 宏定义

  • define只是简单地字符替换,特别注意有无括号的区别。
  • 可以嵌套,可以带参数,可以是一个语句。