C函数调用作为测试条件

car*_*995 0 c function

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

代码 :

if(printf("blahblah\n");{  
}
Run Code Online (Sandbox Code Playgroud)


我的想法 :

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;
}
Run Code Online (Sandbox Code Playgroud)



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

#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;
}
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

3.)我尝试将`count ++ <size作为左操作数切换到测试条件,而输入函数作为右操作数.

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

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

Jam*_*lis 9

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

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

两者之间没有区别

if (printf("Hello, World!")) { }
Run Code Online (Sandbox Code Playgroud)

int i;
i = printf("Hello, World!");
if (i) { }
Run Code Online (Sandbox Code Playgroud)

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


在您修改的第二个示例中,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;
}
Run Code Online (Sandbox Code Playgroud)

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