C s[&x2B;&x2B;i]之间的差异;和s[i]++;我
我正在做一些“C编程语言”的练习,不知道是什么给了我一定的输出。这并不是一个真正的障碍,因为我得到了我想要的输出,但我不明白为什么更改某段代码会给我想要的输出。我只是想找个解释 下面是我想要的代码。我不理解的部分是C s[&x2B;&x2B;i]之间的差异;和s[i]++;我,c,loops,for-loop,post-increment,pre-increment,C,Loops,For Loop,Post Increment,Pre Increment,我正在做一些“C编程语言”的练习,不知道是什么给了我一定的输出。这并不是一个真正的障碍,因为我得到了我想要的输出,但我不明白为什么更改某段代码会给我想要的输出。我只是想找个解释 下面是我想要的代码。我不理解的部分是s[++I]=''在“k”for循环中。在我使用s[++I]之前,我使用了: s[i]='' ++i 这将只在数组中放置1个空间,无论k循环运行多少次 然后,为了测试,我放置了++I以上s[i]=''并且我的输出中没有一个空格 #include <stdio.h> #def
s[++I]=''代码>在“k”for循环中。在我使用s[++I]
之前,我使用了:
s[i]=''代码>
++i代码>
这将只在数组中放置1个空间,无论k循环运行多少次
然后,为了测试,我放置了++I代码>以上s[i]=''代码>并且我的输出中没有一个空格
#include <stdio.h>
#define MAXLINE 1000
#define TABSTOP 5
/* Write a program "detab" that replaces tabs in the input with a proper
number of blanks to space to the next tab stop. Assume a fixed set of tab
stops, say every n columnns. Should n be a variable or a synbolic parameter? */
int main() {
char c;
int i, j;
int modTabStop, numTabs, k;
char s[MAXLINE];
i = 0;
while((c = getchar()) != EOF) {
if(c == '\t') {
modTabStop = i % TABSTOP;
numTabs = TABSTOP - modTabStop;
for(k = 0;k <= numTabs; ++k)
s[++i] = ' ';
}
else if(c == '\n') {
;
}
else {
s[i] = c;
++i;
}
}
for(j = 0;j <= i;++j)
printf("%c", s[j]);
return 0;
}
#包括
#定义MAXLINE 1000
#定义止动块5
/*编写一个程序“detab”,将输入中的制表符替换为正确的制表符
到下一个制表位的空格数。假设一组固定的选项卡
停止,每n列说一次。n应该是变量还是合成参数*/
int main(){
字符c;
int i,j;
int modTabStop,numTabs,k;
字符s[MAXLINE];
i=0;
而((c=getchar())!=EOF){
如果(c=='\t'){
modTabStop=i%TABSTOP;
numTabs=TABSTOP-modTabStop;
对于(k=0;k而言,两者之间存在显著差异
s[i]
i++;
及
在解释之前,让我将第一个表单简化为s[i++]
,这样您就可以
s[i++]
及
我相信这会让事情变得更清楚,这就是增量前和增量后的区别
不同之处在于,预增量s[++i]
先将i
的值递增,然后再将其注入到表达式中,在本例中,表达式是数组访问运算符。而增量后将i的值首先注入数组访问运算符,然后再递增,就像最初在展开的两行形式中所做的一样。我们之间有一个主要区别嗯
s[i]
i++;
及
在解释之前,让我将第一个表单简化为s[i++]
,这样您就可以
s[i++]
及
我相信这会让事情变得更清楚,这就是增量前和增量后的区别
不同之处在于,预增量s[++i]
先将i
的值递增,然后再将其注入到表达式中,在我们的例子中,表达式是数组访问运算符。而增量后将首先将i的值注入数组访问运算符,然后再将其递增,就像最初在展开的两行形式中所做的一样。首先启动此循环
for(k = 0;k <= numTabs; ++k)
^^^
while((c = getchar()) != EOF) {
也不正确,因为位置i
处的字符未更改。由于预增量运算符++i
而跳过该位置
你应该改写
s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
最后,循环看起来是这样的
for(k = 0;k < numTabs; ++k)
^^^
for(k = 0;k < numTabs; ++k)
s[i++] = ' ';
这是不正确的
你应该改写
s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
否则,如果您输入多个语句,它们将不会分开
在第一种情况下,应删除该if声明
而不是宣言
char c;
int c;
你应该使用声明
char c;
int c;
因为类型char可以表现为类型unsigned char(取决于编译器选项)。在这种情况下,比较c!=EOF
将始终为真。对于初学者,此循环
for(k = 0;k <= numTabs; ++k)
^^^
while((c = getchar()) != EOF) {
也不正确,因为位置i
处的字符未更改。由于预增量运算符++i
而跳过该位置
你应该改写
s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
最后,循环看起来是这样的
for(k = 0;k < numTabs; ++k)
^^^
for(k = 0;k < numTabs; ++k)
s[i++] = ' ';
这是不正确的
你应该改写
s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
否则,如果您输入多个语句,它们将不会分开
在第一种情况下,应删除该if声明
而不是宣言
char c;
int c;
你应该使用声明
char c;
int c;
因为类型char可以表现为类型unsigned char(取决于编译器选项)。在这种情况下,比较c!=EOF
将始终为真。考虑以下代码:
for(k = 0;k <= numTabs; ++k)
s[i] = ' ';
++i;
将i
递增numTabs
次,然后写入一个空格。这会在数组中留下numTabs
字符,可能是一个终止NULL
解决方案很简单:使用大括号考虑以下代码:
for(k = 0;k <= numTabs; ++k)
s[i] = ' ';
++i;
将i
递增numTabs
次,然后写入一个空格。这会在数组中留下numTabs
字符,可能是一个终止NULL
解决方案很简单:使用大括号谢谢你的快速回复!好的,前后增量都是有意义的。但是有什么原因导致两行形式不起作用而单行形式会起作用吗?这就是我最困惑的地方。比如s[++i]
在我的代码中起作用,但两行形式给了我错误/不同的输出(1个空格vs 2个空格)如果要在预递增时使用两行形式,必须先执行i=i+1
,然后使用it@ubernoob1010-在尝试双语句形式时,是否在循环体中包含大括号?此外,在使用双语句形式时,将数组的不同元素赋值Jonathan,没有忘记了大括号,现在发这个感觉真的很傻。我一直在胡闹,我想我完全忽略了这么简单的事情。谢谢你的帮助,很抱歉浪费了你的时间!谢谢你的超级快速回复!好的,前后增量是有意义的。但是有什么原因导致两行表格不能工作和单行形式会吗?这是我最困惑的地方。就像s[++i]
在我的代码中工作一样,但是两行形式给了我错误的/不同的输出(1个空格vs 2个空格)。如果你想在预递增时使用两行形式,你必须先执行i=i+1
,然后使用it@uberno