几天前我脑子里出现了一个奇怪的想法,即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.
非常感谢你的帮助,请纠正我的错误.我愿意从中吸取教训.
对我来说,我认为这个代码总是被评估为真(我的假设),因为测试条件被函数调用所取代.
这是不正确的.函数(在本例中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(如果您提供任何其他输入).