C 为什么可以';我用I=-1初始化一个循环?
当我偶然发现这个我不懂的东西时,我正在学习循环 在这个代码中,如果我在for循环中输入,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
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,它会被反复调用,这是非常低效的。将长度存储在一个变量中,而不要使用tryi
-->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