我有一個代碼,它以遞回方式列印指向const char,或者我的意思是 a 。string當我使用 =運算子呼叫print()函式時,我的代碼作業正常。但是,當我使用 運算子時,我的代碼進入了一個無限回圈,只是列印'H'.
這是我的代碼:TRY IT
#include <stdio.h>
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print(s = 1); // infinite loop when `s `
}
int main(void){
print("Hello");
return 0;
}
我知道在任何回圈中,例如:
for(size_t i = 0; i < 10; i ) { }
完全等價于
for(size_t i = 0; i < 10; i = 1) { }
那么,請告訴我錯過了什么?
uj5u.com熱心網友回復:
您正在使用(后綴)后遞增運算子 ,其值是遞增之前運算元的值。所以你用相同的指標值呼叫函式。您需要使用預增量運算子
void print(const char *s){
if(*s == 0)
return;
putc(*s, stdout);
print( s );
}
來自 C 標準(6.5.2.4 后綴遞增和遞減運算子)
2后綴 運算子的結果是運算元的值。作為副作用,運算元物件的值會遞增(即,將相應型別的值 1 添加到其中)。
至于 for 回圈
for(size_t i = 0; i < 10; i ) { }
i 然后不使用運算式的值。i在應用運算子遞增它的副作用后使用該變數。要檢查這一點,您可以按以下方式撰寫 for 回圈
for(size_t i = 0; i < 10; printf( "%zu ", i ) ) { }
uj5u.com熱心網友回復:
s 是后增量。它回傳 的原始值s,而不是增量值。這意味著
print(s );
相當于
print(s);
s ;
由于print(s)呼叫print(s),你得到一個無限回圈。
要在遞增后獲取 的值s,請使用預遞增。
print( s);
這相當于
s;
print(s);
最后,沒有理由改變s。你應該簡單地使用
print(s 1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434838.html
上一篇:strcasecmp實作不列印
