我的情况是我需要输入一些字符,在读完一个特定字符后(这里*)我需要突破循环。
代码:
void main()
{
int i=0,temp=0;
char a[100];
printf("Enter the array\n");
for(i=0;a[i]!='*';i++)
{
scanf("%c",&a[i]);
}
}
即使我输入了' *'它没有出现在循环中。
我更改了如下所示的代码,它可以正常工作。
void main()
{
int i=0,temp=0;
char a[100];
printf("Enter the array\n");
for(i=0;;i++)
{
scanf("%c",&a[i]);
if(a[i]=='*')
break;
}
}
第一个代码有什么问题? 我正在使用gcc编译器。
答案 0 :(得分:3)
using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void OnCollisionEnter2D(Collision2D coll) { if (coll.gameObject.tag == "Enemy") coll.gameObject.SendMessage("collided", 10); } }
使用与此声明中使用的void main()
{
int i=0,temp=0;
char a[100];
printf("Enter the array\n");
for(i=0;a[i]!='*';i++)
{
scanf("%c",&a[i]);
}
}
相同的值来执行测试a[i]!='*'
i
在扫描和测试之间 scanf("%c",&a[i]);
递增。
序列是:
i
设为i
0
不小于i
,则100
a[0]
*
a[0]
i
不小于i
,则100
a[1]
*
a[1]
i
不小于i
,则从上面你还可以了解到,代码在之前测试了100
的元素,它们获得了任何值。这样做会引发臭名昭着的未定义行为,这是一件坏事,因为从任何可能发生的那一刻起。
答案 1 :(得分:1)
这是因为循环在循环执行内部语句之前评估条件 。
所以,它是这样的:
因此,在您输入之前,循环已经检查了“*”。
答案 2 :(得分:0)
问题是class B
{
callAComponent:function(res)
{
this.props.callback(res)
}
render{
return(
<input type="text" onChange={this.callAComponent}//whaever event you are performing
)
}
}
语句在评估for
循环退出条件之前运行i++
增量。如果你在valgrind下运行你的程序,这是一个跟踪未初始化内存的内存调试器,这是非常明显的:
a[i] != '*'
(第一次未初始化的内存访问在读取任何字符之前发生,因为在第一次循环执行之前也会检查循环退出条件。)