C语言程序设计(翁恺)--第三周课件中的三个遗留点

刚刚写完第二周遗留点,下面写第三周的

第三周:判断

1.if和else后面也可以没有{}而是一条语句。如果if后不带{},但是后面跟了两条语句,并且后面还有else语句,那么程序会怎么执行?

在Dev C++中输入如下代码,进行编译

#include "stdio.h"
int main()
{
    int a=0;
    scanf("%d",&a);
    if(a>0)
        a+=1;
        printf("a=%d",a);
    else
        print("a=%d",a);
    return 0;
}

发现如下问题:

image

提示“9    2 [Error] 'else' without a previous 'if'

意思是else找不到对应的if了,说明if后面的第二个语句printf使得编译器认为这个if已经结束,它是一个不带else的if语句,所以后面直接输入else会使编译器报错。

2./* */是注释,编译器不管其中的内容。但是有没有想过编译器会把它替换成什么呢?是一个空格?还是不留痕迹?可以写代码来测试你用的编译器吗?

在Dev C++中输入如下代码,进行编译

#include "stdio.h"
int main()
{
    int/*sdfd*/b;    //编译通过
    in/*sdff*/t a;   //编译出错,提示[Error] unknown type name 'in'和[Error] expected '=', ',', ';', 
                     //'asm' or '__attribute__' before 'a'
    return 0;
}

发现第一条语句编译通过了,而第二条语句编译出错了,提示“[Error] unknown type name 'in'和[Error] expected '=', ',', ';','asm' or '__attribute__' before 'a'”,由这两个结果判断,/**/在编译的时候被编译器替换成了空格

3.分段函数可以用switch-case吗?划算吗?

clipboard

考虑到x=0和x>0是同一个函数f(x)=2*x;那么可以将type分成0/1两种情况来使用switch-case语句,感觉不划算,而且如果分段增加的话就不一定能通过这个方法实现了

代码如下:

#include "stdio.h"
int main()
{
    int type;
    double x,f;
    scanf("%lf",&x);
    type=(x<0);
    switch(type)
    {
        case 0:
            f=2*x;
            break;
        default:
            f=-1;
            break;
    }
    printf("%f",f);
    return 0;
}
原文地址:https://www.cnblogs.com/keepdoing/p/3983117.html