Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 递增整数和初始化位置会产生奇怪的效果吗?_C_Loops_Int - Fatal编程技术网

C 递增整数和初始化位置会产生奇怪的效果吗?

C 递增整数和初始化位置会产生奇怪的效果吗?,c,loops,int,C,Loops,Int,我已经用C语言编写了下面的“刽子手游戏”程序(编写速度快且不干净,所以不要太在意代码): 现在,如果要交换lettsguesed和totaltimesgusted的顺序,则lettsguesed-变量存在问题(仍然是1) ___ 猜测1-输入一个字符:c 它匹配索引0处的字符! 猜中字母:1 c__ 猜测2-输入一个字符:a 它匹配索引1处的字符! 猜中字母:1 ca_ 猜测3-输入一个字符: 最后,如果我把字符放在c两个整数前的行: charc; int-lettersGuessed=0;

我已经用C语言编写了下面的“刽子手游戏”程序(编写速度快且不干净,所以不要太在意代码):

现在,如果要交换
lettsguesed
totaltimesgusted
的顺序,则
lettsguesed
-变量存在问题(仍然是1)

___
猜测1-输入一个字符:c
它匹配索引0处的字符!
猜中字母:1
c__
猜测2-输入一个字符:a
它匹配索引1处的字符!
猜中字母:1
ca_
猜测3-输入一个字符:
最后,如果我把
字符放在c两个整数前的行:

charc;
int-lettersGuessed=0;
int totalTimesGuessed=0;
然后一切都按预期进行!

___
猜测1-输入一个字符:c
它匹配索引0处的字符!
猜中字母:1
c__
猜测2-输入一个字符:a
它匹配索引1处的字符!
猜中字母:2
ca_
猜测3-输入一个字符:
我已经用gcc在Xcode中测试过了


对此必须有一个合乎逻辑的解释吗?我渴望开悟

您正在导致中出现未定义的行为

scanf("%s", &c);
因为
“%s”
说明符向目标添加了一个终止的
nul
字节,该字节是单个
字符

相反,你可以试试看

if (scanf(" %c", &c) != 1)
    handleErrorPlease();
“%c”
前面的空格是有意的,它将吃掉以前调用
scanf
时留下的任何空白字符


当发生未定义的行为时,实际发生的情况取决于加载内存时程序的布局,因此更改已定义变量的顺序会导致行为不同。

guessedWord
不是NUL终止的,因此
printf(“%s\n”,guessedWord)导致未定义的行为。它与您的修改一起工作!但是如果我把“char c;”放在在两个INT以上,保持scanf行不变?请解释为什么更改已定义变量的顺序可以使代码正常工作?@YannickDeTurck和Beele,未定义的行为意味着任何事情都可能发生。它可能第一次工作,但在添加
printf
或执行其他操作时可能会失败。
if (scanf(" %c", &c) != 1)
    handleErrorPlease();