无法解释C中的“if(result1)* result1 = t2”语句

时间:2012-04-26 15:37:27

标签: c if-statement

我不是C程序员,但我正在将C程序翻译成Delphi。一切顺利,除了我无法弄清楚这样的陈述的含义:

if (result1)
    *result1 = t2;

似乎始终要执行赋值,然后针对某些条件进行测试?

完整的C程序列在http://en.wikipedia.org/wiki/Talk%3ATrilateration,如果有帮助的话。

7 个答案:

答案 0 :(得分:3)

在C中,整数和布尔值之间存在同化:任何不为零的数字都表示正确。在C 99中添加了bool类型(遵循C ++的步骤),但这些常见的用法难以根除(并且还有许多使用此约定的遗留源代码)。

该句的真正含义是:

if ( result1 != NULL ) {
    *result1 = t2;
}

这意味着result1是一个指针,如果此行之前的可能内存分配成功,则它用于存储值t2

那么,这与指针有什么关系呢?好吧,指针基本上是一个整数(一个内存地址),而NULL(非常常见,但并不总是)为零。因此,“result1”可以解释为result1 != NULL甚至result1 != 0

最后,当内存分配(或任何其他内存操作)不成功时返回NULL,因此测试指针是否处于活动状态(即,它不是NULL)是很常见的使用它。

答案 1 :(得分:2)

它测试指针result1是否不是null。如果true t2将被指定为result1

的值

答案 2 :(得分:2)

在C / C ++中,未定义行为取消引用NULL指针。简而言之,如果你这样做,可能会发生很糟糕的事情。

因此,在解除引用之前检查NULL的指针始终是一个好习惯 所述代码就是这样做的。

答案 3 :(得分:1)

结果看起来像是指向指针的指针。如果它不为null,则将指向它的指针指向t2。

如果result1不为null,则result1指向一个地址  将地址指向t2

答案 4 :(得分:0)

if (result1 != NULL)
{
    *result1 = t2;
}

如果result1是null指针,则行*result = t2应该会导致SEGFAULT。

答案 5 :(得分:0)

如果你想通过函数参数传递返回结果,它实际上是C中的常见模式。 C函数中没有var个参数,因此您通过将指针作为参数传递给值来模拟该想法,然后该函数可以通过指定指向的位置来设置该值。通过指针。

main中的行如下所示:

result = trilateration(&o1, &o2, p1, r1, p2, r2, p3, r3, MAXZERO);

创建指向变量o1和o2的内存地址的指针(这就是&的含义)。然后是函数中的行

*result1 = t2;

t2分配给result1指向的任何内容,在本例中为o1

该行

if (result1)

测试指针是否为“true”(false与0相同,C中任何非零值为true),因此它与

相同
if (result1 != NULL)  // NULL is effectively the same as 0.

这样做的原因是将NULL作为函数的第一个参数传递是合法的。如果您只想获取两个结果值中的一个,则可能需要执行此操作。所以,你可以放心地做到

result = trilateration(NULL, &o2, p1, r1, p2, r2, p3, r3, MAXZERO);

如果您不关心计算o1

答案 6 :(得分:0)

result1是一个指针;它的值是内存中另一个对象的位置。

在C布尔上下文中,零值积分表达式的计算结果为false,而任何非零值的整数表达式的计算结果为true。在指针上下文中,零值积分表达式被视为 NULL指针常量,它表示明确定义的“无处”并被视为无效指针值。

所以if (result1)测试指针的值;如果它为0,则表示result1没有指向任何有意义的地方,并且因为0也意味着false,所以if语句的主体将不会被执行。这是写if (result1 != NULL)的简写方式。如果该值不为0,那么它是一个有效的指针值(希望如下;见下文),测试通过,表达式*result1 = t2t2的值写入指向的位置 result1

关于指针的一些注释:首先,非NULL指针值不一定是有效指针,因为它的值可能与活动对象的地址不对应。尝试取消引用(访问指向的内存)无效指针的行为是未定义的;你的程序可能会彻底崩溃,或者它可能继续在糟糕的状态下执行,或者它可能正常工作。因此,在声明它们时将所有指针初始化为NULL通常被认为是好的做法,并且当它们指向的任何指针不再使用时将它们设置为NULL。

其次,虽然空指针常量始终为零值,但实现使用的空指针不一定是。由编译器来映射这些值,因此就源代码而言,NULL总是表示0;只是不要认为底层操作系统是真的。