Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么可以';我用I=-1初始化一个循环?_C - Fatal编程技术网

C 为什么可以';我用I=-1初始化一个循环?

C 为什么可以';我用I=-1初始化一个循环?,c,C,当我偶然发现这个我不懂的东西时,我正在学习循环 在这个代码中,如果我在for循环中输入,I=0,它会按预期工作,如果我写“dog”,我会得到3个a,但是如果我写I=-1,我根本不会得到输入,不应该给我额外的a吗 我不能在任何需要的地方启动I值吗 #include <string.h> int main (int argc, char **argv) { char string[10]; scanf("%s", string); v

当我偶然发现这个我不懂的东西时,我正在学习循环

在这个代码中,如果我在for循环中输入,
I=0
,它会按预期工作,如果我写“dog”,我会得到3个a,但是如果我写
I=-1
,我根本不会得到输入,不应该给我额外的a吗

我不能在任何需要的地方启动
I
值吗

#include <string.h>

int main (int argc, char **argv) {
        char string[10];

        scanf("%s", string);

        void changestring (char *newstring) {
                for (int i=0; i < strlen(newstring); i++) {
                        printf("a");
                }
        }
        changestring(string);
}
#包括
int main(int argc,字符**argv){
字符串[10];
scanf(“%s”,字符串);
无效更改字符串(字符*新闻字符串){
for(int i=0;i
首先,为了消除一些混乱,让我们稍微重写一下您的代码(因为对于新手来说,这里发生的事情很少,可能看起来相似,但实际上并非如此)

返回字符串s的长度

size\t
是一种无符号类型。C和C++有一定的规则,当操作中一起使用时,将整数值隐含在一起转换成“公共”类型。这些就是所谓的“整数提升规则”——了解这些规则很重要,你绝对必须学习它们

其中一条规则是,如果使有符号整数与无符号整数“交互”,则提升的类型也将是无符号的。当然,如果试图将负值提升为无符号类型,结果会有所不同

现在使用C时,事情变得很棘手,因为有一些(实际上大多数情况下)尝试这样做会调用未定义的行为,即任何事情都可能发生。但是也有一些例外情况,它实际上表现良好(例如,如果您有两个无符号变量
无符号a=3
无符号b=5
,则操作的结果
a-b
实际上是一个定义良好的值,因为无符号溢出定义良好,结果是
UINT\u MAX-(b-a)

您的底线是:必须重写代码,以便将比较升级为有符号比较,或者转到
strlen(…)+1
,而不是从
-1
开始。不要使用
int
我建议您改用
ptrdiff\u t
,因为int的大小可能足以容纳
strlen
的结果。碰巧(不是C,而是现代OSs如何管理内存)
strlen
永远不会返回可能溢出的值
ptrdiff\u t

ptrdiff_t len = strlen(newstring);
for(ptrdiff_t i=-1; i < len ; i++){
ptrdiff\u t len=strlen(新闻字符串);
for(ptrdiff_t i=-1;i
对于初学者,嵌套函数定义不是C标准功能。您应该在main之外定义函数

至于你在这个表达中的问题

i < strlen(newstring)
它的输出可能看起来像

i = -1, ( size_t )i = 18446744073709551615

strlen()
并且不要在循环中使用strlen,它会被反复调用,这是非常低效的。将长度存储在一个变量中,而不要使用try
i
-->
i<0 | |(未签名)i
i < strlen(newstring)
#include <stdio.h>

int main(void) 
{
    int i = -1;

    printf( "i = %i, ( size_t )i = %zu\n", i, ( size_t  ) i );

    return 0;
}
i = -1, ( size_t )i = 18446744073709551615