考虑一个大小为10的数组arr[10]
。在获取/显示数据时,我们使用以下常用语法的for循环
for(int i=0;i<10;i++)
如果是字符串,则类似于
for(int i=0;strlen(arr)>i;i++)
但我在某处读过像arr[i]
这样简单的表达只能在条件的地方使用。我尝试过运行具有该条件的代码。但是我收到了一个错误。那么有一个类似的,简单的条件表达式可以与数组/字符串一起使用吗?
答案 0 :(得分:7)
如for statement文档中所述:
条件可能是声明
使用以下代码演示:
int main(){
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
for (int i = 0; int x = arr[i]; ++i){
std::cout << x << std::endl;
}
}
一旦arr[i]
变为0
,循环将退出并被分配到x
,导致整个条件评估为false
。为什么会有更详细的信息:
使用brace-or-equals初始值设定项声明单个变量。 在每次迭代之前评估初始化程序,如果是值 如果声明的变量转换为false,则退出循环。
答案 1 :(得分:7)
答案 2 :(得分:2)
是的,对于零终止的C字符串,您可以使用以下
for(int i=0; arr[i]; i++)
因为循环在遇到nul-terminator时会停止。
这不适用于数组,仅适用于以零结尾的字符串。 (它也适用于由转换为false的东西终止的数组,但这是非常罕见的IMO。谢谢@FrançoisAndrieux)
答案 3 :(得分:0)
你可能想要这样的东西:
int main() {
char arr[] = "Hello";
for (int i = 0; char c = arr[i]; i++)
{
putc(c, stdout);
}
}
输出
Hello
当yolu到达字符串的末尾时, c = arr[i]
将为0,因此循环将被终止。
BTW:for(int i = 0; strlen(arr) > i; i++)
是正确但效率低下的。我让你找出为什么做练习。
答案 4 :(得分:0)
我不确定这是simplier
,但它有点不同,适用于字符串,而不适用于其他泛型类型;
您可以使用array []检查字符串终结符
char array[10] = "hello";
for (int i = 0; array[i] != 0; i++)
myFunction(array[i]);
对于字符串,您可以使用指针算法
for (char *aPtr = array; *aPtr != 0; aPtr++)
myFynction(*aPtr);
答案 5 :(得分:0)
我知道写这个:
for(int i=0; arr[i]; i++)
写这个会节省几微秒:
int array_length = strlen (arr);
for(int i=0; i < array_length; i++)
我也意识到像第一个这样的结构在C中非常惯用,经验丰富的C程序员习惯于看到它们。
但是,在我看来,情况必须非常特别,因为保存几个周期比编写其他人很容易理解的代码更重要。作为一个在工作日中花费大量时间寻找其他人代码缺陷的人,我非常感谢表达性的编码实践。
答案 6 :(得分:-1)
你有很多选择但是调用strlen
是最无效的选择(特别是如果按照显示的方式进行)。 arr必须是要递增的指针
while(*arr)
{
/* do something */
arr++;
}
while(arr[i])
{
/* do something */
i++;
}
do
{
/* do something */
}while(*++arr);
do
{
/* do something */
}while(arr[++i]);
for(;*arr;arr++)
{
/* do something */
}
do // is you need to do somethingh with the trailing zero
{
/* do something */
}while(*arr++);
do // is you need to do somethingh with the trailing zero
{
/* do something */
}while(arr[i++]);
等等。