C专家编程 第1章 C:穿越时空的迷雾 1.6 它很棒,但它符合标准吗

发布于:2023-02-03 ⋅ 阅读:(335) ⋅ 点赞:(0)

    什么东西能被语言接受,什么东西不能被语言接受。前两个术语涉及不可移植的代码(unportable code) 
    不可移植的代码(uportable code)
    由编译器定义的(implementation-defined):由编译器设计者决定采取何种行动(就是说,在不同的编译器中所采取的行为可能并不相同,但它们都是正确的),并做好了文档记录。
    例如,当整型向右移位时,要不要扩展符号位。
    未确定的(unspecified):在某些正确的情况下,标准并未规定应该怎样做。
    例如,参数求值的顺序。 

    坏代码(bad code) 
    未定义的(undefined):在某些不正确的情况下的做法,标准并未规定应该怎样做。
    例如,当一个有符号整数溢出时应该采取什么行动。
    约束条件(a constraint):这是一个必须遵守的限制或要求。如果不遵守,那么你的
程序的行为就是上面说的未定义的行为。
    标准规定:编译器只有在违反语法规则和约束条件的情况下才能产生错误信息。
    例如,%操作符要求操作数必须属于整数。
    不属于约束条件规则的例子:所有在c语言标准头文件中声明的标识符均保留。

    flyback transformer 回扫变压器
    可移植的代码(portable code) 
    严格遵循标准的(strictly-conforming):一个严格遵循标准的程序应该具有如下特点:
    *只使用已确定的特性
    *不突破任何由编译器实现的限制
    *不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。
    这样的规定的主要目的就是最大限度地保证可移植性。这样,不论在什么平台上运行严格标准的程序,都会产生相同的输出。 

    /*不是严格遵循标准的程序*/ 
    #include<limits.h>
    #include<stdio.h>

    int main() {
        (void)printf("biggest int is %d", INT_MAX); return 0;
    } 
    并不严格遵循标准,其输出结果使用编译器定义的。为了保证可移植性,在现实代码中,应该始终加上必要的类型转换,返回值等。
    遵循标准的(conforming):一个遵循标准的程序可以依赖某种编译器特有的不可移植的特性。

输出:

    /*
    ** 严格遵循标准的代码。(ANSI C标准)
    */
    #include<limits.h>
    #include<stdio.h>
    
    int main( void ) {
        printf("biggest int is %d", INT_MAX);
        
        return 0;
    }

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到