C 递增整数和初始化位置会产生奇怪的效果吗?
我已经用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;
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();