代码之家  ›  专栏  ›  技术社区  ›  Vishwanath Dalvi

C语言中空概念的困难?

c
  •  5
  • Vishwanath Dalvi  · 技术社区  · 14 年前

    有人能告诉我C语言是如何处理NULL的吗? 而这个程序的输出是3,怎么用空概念呢?

    #include <stdio.h>
    
    int main(void) {
        int i;
        static int count;
        for(i = NULL; i <= 5;) {
            count++;
            i += 2;
        }
    
        printf("%d\n",count);
        return 0;
    }
    
    8 回复  |  直到 10 年前
        1
  •  3
  •   msw    14 年前

    NULL stdio.h 或者stdio包含的文件。它可以不同地定义为零的某种变化。

    cc -E )你可以在你的默示上看到它的意思:

    void main(){
        int i;
        static int count;
        for(i=((void *)0); i<=5 ;){
           count++;
           i+=2;
        }
        printf("%d",count);
    }
    

    无效的

    int main(){
        int i;
        int count = 0;
        for(i = 0; i <= 5; i += 2){
           count++;
        }
        printf("%d\n",count);
        return 0;
    }
    
        2
  •  21
  •   Larry Osterman    14 年前

    对于C,“NULL”传统上定义为(void*)0—换句话说,它是地址0的指针别名。对于C++,“null”通常被定义为“0”。C++和C中NULL的问题是它不是类型安全的——可以构建类似于代码示例中包含的一个奇怪结构。

    对于C++,语言设计者通过添加一个新的“null pTR”类型来修复C++中的这个类型,它可以隐式地转换为任何指针类型,但是不能转换成整数类型。

        3
  •  3
  •   Jens    14 年前

    C FAQ 这应该能回答你所有的问题。

    • 5.1这个臭名昭著的空指针到底是什么?
    • 5.2如何在程序中获取空指针?
    • 5.3是缩写指针比较 if(p)
    • 5.4什么是 NULL 它是如何定义的?
    • 5.5在使用非零位模式作为空指针内部表示的机器上,应该如何定义空?
    • 无效的 定义如下: #define NULL ((char *)0)
    • 5.7我的供应商提供的头文件#将NULL定义为0L。为什么?
    • 无效的 对指向函数的指针有效吗?
    • 无效的
    • 5.10但是使用它不是更好吗 无效的 (而不是0),如果
    • 5.11我曾经用过一个编译器,除非 无效的
    • 5.12我使用预处理器宏 #define Nullptr(type) (type *)0
    • 5.13这很奇怪。 无效的
    • 5.15我很困惑。我就是不懂这些空指针的东西。
    • 5.17严肃地说,有没有任何实际的机器真的使用了非零空指针,或者对指向不同类型的指针使用了不同的表示?
    • 5.18是否将运行时整数值0转换为指针,并保证为空指针?
    • 5.19如何访问位于机器位置0的中断向量?如果将指针设置为0,编译器可能会将其转换为非零的内部空指针值。
    • 5.20运行时“空指针分配”错误是什么意思?我怎样才能找到它?
        4
  •  2
  •   zneak    14 年前

    NULL 在处理指针时有很大的意义。在处理整数时,最好只使用零。

    严格地说, 无效的 简单地说就是值0加上一个花哨的名字,但它最重要的部分确实是它花哨的名字。它之所以存在,是因为它不那么模棱两可 int* p = NULL; int* p = 0; . 既然我们知道 是一个指针,我们确信我的意思是 p 成为一个指针。

    所以,当你处理指针并想表示 0 ,使用 无效的 . 当你处理数字,想代表 ,使用 0 . (在您的示例中,您应该使用 0 无效的 .)

        5
  •  1
  •   ChrisF    14 年前

    NULL 0 . 它更正确地用于指示空指针。

    在这种情况下,代码实际上是:

    for (i = 0; i <= 5)
    {
        count++;
        i += 2;
    }
    
        6
  •  0
  •   Starkey    14 年前

    NULL不应该这样使用。NULL应与指针一起使用。

        7
  •  0
  •   pmg    14 年前

    NULL 以及 i 是不同的,但是 C 原谅你:)

    不是一种类型安全的语言。我的意思是:它可以让你混合其他语言会抱怨的类型。

    C级 chars doubles ,你可以乘 ints , ...

    null pointer constant (属于类型) void * )到一个 int . C级 允许,但是

    将空指针常量赋值给int的结果与赋值相同 0 去吧。所以你从 存在 0

    在没有初始值设定项的情况下,静态自动变量被初始化为 0 count 在你的程序里。

    所以,循环先开始( 计数 变成1)与 那么是0 变成2。
    现在循环开始了( 计数 变成2)与 那么是2岁 变成4。
    现在循环开始了( 计数 那么是4岁
    计数 .


    • main 应申报 int main(void)
    • 您应该在每一行之后输出一个换行符( printf("%d\n", count); )
    • return 0; 向操作系统指示程序成功完成
        8
  •  0
  •   dmckee --- ex-moderator kitten    14 年前

    不要把c中的空指针和某些动态语言中的可空类型或数量混淆起来。有相似的,但有不同的用途和意义。

    在c中,NULL的概念只在指针的上下文中使用,而指针是指向 已知无效 内存位置(通常,但不总是,用零表示)。

    这与表示不可设置性的类型或变量不同。请注意,这样的类型可以由用户在c中定义和管理,但不是由语言提供的。