我想在while循环中比较字符串中的相邻字符,但是下面的2个if语句给出了不同的结果。
第一:(这不起作用)
if (input_str[k] == input_str[++k]) {
count++;
}
e.g。当k = 0时,它应该是" if(input_str [0] == input_str [1])"
第二:(这有效)
if (input_str[k++] == input_str[k]) {
count++;
}
e.g。当k = 0时,它应该是" if(input_str [0] == input_str [1])"
我想安全的方法将是以下代码,但我仍然想知道为什么另外两个if语句会产生不同的结果。
if (input_str[k] == input_str[k + 1]) {
count++;
}
k++;
答案 0 :(得分:4)
在所有这些情况下:
input_str[k] == input_str[++k]
input_str[k++] == input_str[k]
input_str[k] == input_str[k + 1]
第一个表达式 not 保证在第二个表达式之前进行评估。在第二个表达式之后也可以进行评估。
即。何时k = 0
,
input_str[k] == input_str[++k]
可能会被评估为input_str[0] == input_str[1]
或input_str[1] == input_str[1]
。input_str[k++] == input_str[k]
可能会被评估为input_str[0] == input_str[1]
或input_str[0] == input_str[0]
。input_str[k] == input_str[k + 1]
将始终评估为input_str[0] == input_str[1]
。简而言之,您在前两种情况下调用未定义的行为,唯一安全的方法是使用k + 1
然后递增k
的方式
请参阅this question,了解发生这种情况的原因。