几天前我脑子里出现了一个奇怪的想法,就是以一种奇怪的方式操纵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
。
非常感谢你的帮助,请纠正我的错误。我愿意从中吸取教训。
答案 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)
该程序似乎卡住了,但实际上它希望您输入数字。也就是说,你必须输入数字,直到计数等于输入数字。