0

最近我在下面的示例中在 C 中看到了这个 while 循环条件,但我不知道 while 条件的真正含义以及编译器如何知道它何时完成。有人可以向我解释吗?

这就是我认为的意思:while 循环遍历 char 数组,直到数组结束,因为没有别的东西,然后 while 循环结束,还是我错了?我尝试使用相同的 while 循环,但使用另一种语言(例如 Go),但是编译器抛出错误,说我不能使用非布尔值。

// C program to demonstrate 
// example of tolower() function. 

#include <ctype.h> 
#include <stdio.h> 

int main() 
{ 
    int j = 0; 
    char str[] = "GEEKSFORGEEKS\n"; 

    // Character to be converted to lowercase 
    char ch = 'G'; 

    // convert ch to lowercase using toLower() 
    char ch; 

    while (str[j]) { // <- this part, how is this a condition?
        ch = str[j]; 

        // convert ch to lowercase using toLower() 
        putchar(tolower(ch)); 

        j++; 
    } 

    return 0; 
} 
4

3 回答 3

2

while 循环可以理解为“当这个字符串有字符时”,并且在 C 字符串或字符数组中已知包含一个 '\0' => Null 字符,最后,一旦 while 循环实现它,它将停止迭代。

所以是的!你说的对。

于 2020-06-01T12:03:38.897 回答
2

您可以将字符数组视为如下:

在此处输入图像描述

所以你在图片中看到一个字符数组已经是一个指针,每个字符都有一个地址,而且指针的地址是第一个元素的地址,所以当你声明

char str[] = "GEEKSFORGEEKS\n"; 

它被分配在内存中,如下所示:

[G][E][E][K][S][F][O][R][G][E][E][K][S][\n][\0]

程序将崩溃,因为您重新声明了ch变量,并且无需初始化,char ch = 'G';因为您在 while 循环中覆盖它并且它将占用 str[j],因此您开始在j = 0处进行迭代数组[G]中的第一个索引,当您增加循环时,循环将一直持续到空字符[\0]并停止,因为NULL之后没有迭代,在其他示例中,您可能会在循环中看到以下条件:while(str[j] != '\0')这与您的情况相似,但更具体。

您可以通过迭代指针来获得更多性能,如下所示:

#include <ctype.h> 
#include <stdio.h> 

int main() 
{
    char *str = "GEEKSFORGEEKS\n";

    while (*str)
        putchar(tolower(*str++));

    return 0; 
}
于 2020-06-01T12:46:18.737 回答
0

虽然,你得到了答案。不过,我想在这里添加更多细节或解释性答案。

在 C 中,条件语句将具有值 1 或 0。最后,它们都被评估为布尔值truefalse10

因此,首先,尝试理解或试运行while(str[j])str[j]猜猜当 j = 0 时的值是多少。它将是第一个字符"G"。同样,在下一次迭代中,您将获得下一个字符,直到NULL字符或字符串终止字符。现在,这些括号之间的任何内容都while(str[j])将被视为条件语句,并且它们都被评估为 1 或 0。现在的情况是,无论如何,如果该条件语句没有被专门评估为 0,那么它会被认为具有 1 的值。因此,这里str[j] when j = 0将被评估为1,然后是下一个字符,依此类推。现在,当我们找到\0whichescape character等价于0. 所以,在\0while 循环将终止,因为条件为假。

你能告诉我这个程序的输出是什么吗?

#include<stdio.h>

int main()
{
    if(printf("Hello TraineeGuy\n"))
        printf("TRUE");
    else
        printf("FALSE");
    return 0;
}
于 2020-06-01T12:47:45.770 回答