C函数调用作为测试条件

时间:2011-05-04 04:03:15

标签: c function

几天前我脑子里出现了一个奇怪的想法,就是以一种奇怪的方式操纵if();语句。让我们继续简单的代码。

守则:

if(printf("blahblah\n");{  
}


我的想法:

1.)对我来说,我认为这段代码总是被评估为真(我的假设),因为测试条件被函数调用所取代。



所以今天我正在做一本书提供的练习(只是为了帮助我刷新几天前学到的东西)。这是代码。

守则:

#include <stdio.h>

int main(void) // This program would add up the value enter by user , for e.g with the 
{              //input of 20 , it will print out the sum of 1+2+3+4+5.....20.

 int count , sum , size;

 count = 0;

 sum = 0;

    printf("Enter a value to find the sum of it from 1 : ");
    scanf("%d" , &size);

    while (count++ < size)

    sum = sum + count;

    printf("sum = %d\n" , sum);

 return 0;
}



通过在第一个代码上使用我的想法,我将第二个代码修改为此。

#include <stdio.h>

int main(void)
{
    int count , sum , size;

    count = 0;

    sum = 0;

    printf("Enter a value to find the sum of it from 1 : ");

    while (scanf("%d" , &size) && count++ < size )

            sum = sum + count;

        printf("sum = %d\n" , sum);

    return 0;
}

问题:

1.)基于我在第一个代码中做出的假设,scanf()函数假设总是被评估为true。这就是为什么第二个测试条件count++ < size是决定是否while声明中的陈述将被执行或不被执行。

2.)但是当我运行程序时,我输入30但它不起作用,程序只是在我点击进入后没有做任何事情就停在那里。

3.)我尝试用`count ++&lt;切换到测试条件大小为左操作数,输入函数为右操作数。

4.)执行此操作后,得到的结果是不同的。当我尝试运行程序时,程序执行第二个printf()函数语句,并打印出sum = 0

非常感谢你的帮助,请纠正我的错误。我愿意从中吸取教训。

2 个答案:

答案 0 :(得分:9)

  

对我来说,我认为这段代码总是被评估为真(我的假设),因为测试条件被函数调用所取代。

这是不正确的。函数(在本例中为printf)返回一个值(在本例中为int)。当您将它用作if语句中的条件时,将调用该函数,并且它返回的值将成为条件:如果它返回零,则计算结果为false;如果它返回非零值,则计算结果为true。

之间没有区别
if (printf("Hello, World!")) { }

int i;
i = printf("Hello, World!");
if (i) { }

(当然,除了第二个例子中的附加变量。)


在修改后的第二个示例中,每次检查循环条件时都会调用scanf。您可以像这样重写循环:

while (1)
{
    int result_of_scanf;

    result_of_scanf = scanf("%d", &size);
    if (result_of_scanf == 0)
        break;

    if (count++ >= size)
        break;

    sum += count;
}

scanf不只是被召唤一次;它会在循环的每次迭代中被调用。 scanf返回它成功读取的元素数,因此在这种情况下,它将返回1(如果您输入int范围内的有效整数)或{{1} (如果你提供任何其他输入)。

答案 1 :(得分:0)

该程序似乎卡住了,但实际上它希望您输入数字。也就是说,你必须输入数字,直到计数等于输入数字。