Error[8]: Undefined offset: 2, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在对变量进行运算时,如果表达式运算结果依然对变量自身赋值,如:

a=a+1;a=a*3;a=a-1;

等表达式,我们可以对其进行简写,可以写成:

a+=1;a*=3;a-=1;

上述表达式中的"+="、"*="、"-="叫作复合赋值运算符,在C、C++中,复合赋值运算符还有另外的几个。

对于上述复合赋值运算符中的两种情况,即:a+=1和a-=1,又有进一步的简写:

a++;++a;a--;--a;

其中的运算符"++"称为自加运算符,"--"称为自减运算符,如果仅仅只是对变量a进行单独的运算,运算符放在变量a前面或者放在其后面都没有区别。

只有当变量a需要在表达式中参与运算时,也即需要使用该变量时,才需要区分自增、自减运算符的位置。

1、++a,--a表示在使用a之前,即取a的值参与表达式中的运算之前,先完成自增或自减运算;

2、a++,a--表示在使用之后在对变量a进行自增、自减运算,也即表达式直接取变量a当前的值进行运算,当变量a所在表达式运算结束之后,再完成变量a的自增、自减运算。

综合以上解释,对如下代码:

#include 
int main(void){
    int a,b,c;
    a=2;
    b=3;
    c=(a++)*(b++)*(++a)*(a--)*(--b);
    printf("c=%d\n",c);
    printf("a=%d\tb=%d",a,b);
    retrun 0;
}

先根据上述解释,推测a、b、c运算之后的结果:

由于表达式括号外都是乘法运算,从左往右看就行,现在只需要确定各括号内的值:

a++:表示取a当前值2进行运算,并在整个表达式运算结束进行1次自增;

b++:表示取b当前值3进行运算,并在整个表达式运算结束进行1次自增;

++a:表示将a的当前值加1参与运算,即用a=2+1=3进行运算,此后a的值为3;

a--:表示取a当前值3参与运算,并在整个表达式运算结束进行1次自减;

--b:表示将b的当前值减1参与运算,即用b=3-1=2进行运算,此后b的值为2。

由此可知:c=2*3*3*3*2=108;a=3+1-1=3;b=2+1=3

程序运行结果如下:

可见,结果和推测的结果完全一致。

值得注意的是,推测时是按表达式中运算符的优先级和结合方向逐个计算的,理论上编译器也都是按这个顺序编译的,但我也不确定这一点,望指正!

此外,需要注意不管是哪一种复合赋值运算符,都是针对变量而言的,对于常量不能这么搞。

主要情形:用数组名作为函数的实参和形参时,混淆了数组名和指针变量的用法——

即:如果将指针变量pA指向一个一维数组A[N],那么在进行引用数组元素,比如循环输出所有元素时,可以用下标法进行索引,也可以用指针法,有如下代码:

int main(int argc, char* argv[]) {
	char A[6] = "China";
	char* pA;
	pA = A;

	//第一种:直接用下标索引,人畜无害
	for (int i = 0; A[i] != '//第三种:直接用数组名作为索引,并对数组名进行自增运算,以图改变指向
for (; *(A) != '[+++]';) {
	printf("%c", *(A++));
}
printf("\n");'; i++) {
		printf("%c", A[i]);
	}
	printf("\n");

	//第二种:定义指针变量指向数组首元素,往后对指针变量自增运算,以改变指向,这也是正确的
	for (; *(pA) != '[+++]';) {
		printf("%c", *(pA++));
	}
	printf("\n");

	system("pause");
	return 0;
}

 上述两种结果如下:

由于数组名A表示数组A[N]的首元素地址,pA最开始也是指向数组A[N]的首元素地址,初学者就容易将二者的用法搞混,误以为也可以用数组名进行同样的 *** 作:

[+++]

可见有如下错误提示:

 以上唯一一个错误的地方就是:"A++",这是因为A作为数组名,代表数组首元素地址,它是一个常量,无法像指针变量pA一样进行自增运算,出现这种错误的原因,无非就是对常量、变量的性质,以及对运算符的功能理解不透彻。

 

 

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 3, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在对变量进行运算时,如果表达式运算结果依然对变量自身赋值,如:

a=a+1;a=a*3;a=a-1;

等表达式,我们可以对其进行简写,可以写成:

a+=1;a*=3;a-=1;

上述表达式中的"+="、"*="、"-="叫作复合赋值运算符,在C、C++中,复合赋值运算符还有另外的几个。

对于上述复合赋值运算符中的两种情况,即:a+=1和a-=1,又有进一步的简写:

a++;++a;a--;--a;

其中的运算符"++"称为自加运算符,"--"称为自减运算符,如果仅仅只是对变量a进行单独的运算,运算符放在变量a前面或者放在其后面都没有区别。

只有当变量a需要在表达式中参与运算时,也即需要使用该变量时,才需要区分自增、自减运算符的位置。

1、++a,--a表示在使用a之前,即取a的值参与表达式中的运算之前,先完成自增或自减运算;

2、a++,a--表示在使用之后在对变量a进行自增、自减运算,也即表达式直接取变量a当前的值进行运算,当变量a所在表达式运算结束之后,再完成变量a的自增、自减运算。

综合以上解释,对如下代码:

#include 
int main(void){
    int a,b,c;
    a=2;
    b=3;
    c=(a++)*(b++)*(++a)*(a--)*(--b);
    printf("c=%d\n",c);
    printf("a=%d\tb=%d",a,b);
    retrun 0;
}

先根据上述解释,推测a、b、c运算之后的结果:

由于表达式括号外都是乘法运算,从左往右看就行,现在只需要确定各括号内的值:

a++:表示取a当前值2进行运算,并在整个表达式运算结束进行1次自增;

b++:表示取b当前值3进行运算,并在整个表达式运算结束进行1次自增;

++a:表示将a的当前值加1参与运算,即用a=2+1=3进行运算,此后a的值为3;

a--:表示取a当前值3参与运算,并在整个表达式运算结束进行1次自减;

--b:表示将b的当前值减1参与运算,即用b=3-1=2进行运算,此后b的值为2。

由此可知:c=2*3*3*3*2=108;a=3+1-1=3;b=2+1=3

程序运行结果如下:

可见,结果和推测的结果完全一致。

值得注意的是,推测时是按表达式中运算符的优先级和结合方向逐个计算的,理论上编译器也都是按这个顺序编译的,但我也不确定这一点,望指正!

此外,需要注意不管是哪一种复合赋值运算符,都是针对变量而言的,对于常量不能这么搞。

主要情形:用数组名作为函数的实参和形参时,混淆了数组名和指针变量的用法——

即:如果将指针变量pA指向一个一维数组A[N],那么在进行引用数组元素,比如循环输出所有元素时,可以用下标法进行索引,也可以用指针法,有如下代码:

int main(int argc, char* argv[]) {
	char A[6] = "China";
	char* pA;
	pA = A;

	//第一种:直接用下标索引,人畜无害
	for (int i = 0; A[i] != '//第三种:直接用数组名作为索引,并对数组名进行自增运算,以图改变指向
for (; *(A) != '';) {
	printf("%c", *(A++));
}
printf("\n");'; i++) {
		printf("%c", A[i]);
	}
	printf("\n");

	//第二种:定义指针变量指向数组首元素,往后对指针变量自增运算,以改变指向,这也是正确的
	for (; *(pA) != '[+++]';) {
		printf("%c", *(pA++));
	}
	printf("\n");

	system("pause");
	return 0;
}

 上述两种结果如下:

由于数组名A表示数组A[N]的首元素地址,pA最开始也是指向数组A[N]的首元素地址,初学者就容易将二者的用法搞混,误以为也可以用数组名进行同样的 *** 作:

[+++]

可见有如下错误提示:

 以上唯一一个错误的地方就是:"A++",这是因为A作为数组名,代表数组首元素地址,它是一个常量,无法像指针变量pA一样进行自增运算,出现这种错误的原因,无非就是对常量、变量的性质,以及对运算符的功能理解不透彻。

 

 

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 4, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

在对变量进行运算时,如果表达式运算结果依然对变量自身赋值,如:

a=a+1;a=a*3;a=a-1;

等表达式,我们可以对其进行简写,可以写成:

a+=1;a*=3;a-=1;

上述表达式中的"+="、"*="、"-="叫作复合赋值运算符,在C、C++中,复合赋值运算符还有另外的几个。

对于上述复合赋值运算符中的两种情况,即:a+=1和a-=1,又有进一步的简写:

a++;++a;a--;--a;

其中的运算符"++"称为自加运算符,"--"称为自减运算符,如果仅仅只是对变量a进行单独的运算,运算符放在变量a前面或者放在其后面都没有区别。

只有当变量a需要在表达式中参与运算时,也即需要使用该变量时,才需要区分自增、自减运算符的位置。

1、++a,--a表示在使用a之前,即取a的值参与表达式中的运算之前,先完成自增或自减运算;

2、a++,a--表示在使用之后在对变量a进行自增、自减运算,也即表达式直接取变量a当前的值进行运算,当变量a所在表达式运算结束之后,再完成变量a的自增、自减运算。

综合以上解释,对如下代码:

#include 
int main(void){
    int a,b,c;
    a=2;
    b=3;
    c=(a++)*(b++)*(++a)*(a--)*(--b);
    printf("c=%d\n",c);
    printf("a=%d\tb=%d",a,b);
    retrun 0;
}

先根据上述解释,推测a、b、c运算之后的结果:

由于表达式括号外都是乘法运算,从左往右看就行,现在只需要确定各括号内的值:

a++:表示取a当前值2进行运算,并在整个表达式运算结束进行1次自增;

b++:表示取b当前值3进行运算,并在整个表达式运算结束进行1次自增;

++a:表示将a的当前值加1参与运算,即用a=2+1=3进行运算,此后a的值为3;

a--:表示取a当前值3参与运算,并在整个表达式运算结束进行1次自减;

--b:表示将b的当前值减1参与运算,即用b=3-1=2进行运算,此后b的值为2。

由此可知:c=2*3*3*3*2=108;a=3+1-1=3;b=2+1=3

程序运行结果如下:

可见,结果和推测的结果完全一致。

值得注意的是,推测时是按表达式中运算符的优先级和结合方向逐个计算的,理论上编译器也都是按这个顺序编译的,但我也不确定这一点,望指正!

此外,需要注意不管是哪一种复合赋值运算符,都是针对变量而言的,对于常量不能这么搞。

主要情形:用数组名作为函数的实参和形参时,混淆了数组名和指针变量的用法——

即:如果将指针变量pA指向一个一维数组A[N],那么在进行引用数组元素,比如循环输出所有元素时,可以用下标法进行索引,也可以用指针法,有如下代码:

int main(int argc, char* argv[]) {
	char A[6] = "China";
	char* pA;
	pA = A;

	//第一种:直接用下标索引,人畜无害
	for (int i = 0; A[i] != '//第三种:直接用数组名作为索引,并对数组名进行自增运算,以图改变指向
for (; *(A) != '';) {
	printf("%c", *(A++));
}
printf("\n");'; i++) {
		printf("%c", A[i]);
	}
	printf("\n");

	//第二种:定义指针变量指向数组首元素,往后对指针变量自增运算,以改变指向,这也是正确的
	for (; *(pA) != '';) {
		printf("%c", *(pA++));
	}
	printf("\n");

	system("pause");
	return 0;
}

 上述两种结果如下:

由于数组名A表示数组A[N]的首元素地址,pA最开始也是指向数组A[N]的首元素地址,初学者就容易将二者的用法搞混,误以为也可以用数组名进行同样的 *** 作:

[+++]

可见有如下错误提示:

 以上唯一一个错误的地方就是:"A++",这是因为A作为数组名,代表数组首元素地址,它是一个常量,无法像指针变量pA一样进行自增运算,出现这种错误的原因,无非就是对常量、变量的性质,以及对运算符的功能理解不透彻。

 

 

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
C语言:自增、自减运算及其在表达式中的计算过程-以(a++)*_C_内存溢出

C语言:自增、自减运算及其在表达式中的计算过程-以(a++)*

C语言:自增、自减运算及其在表达式中的计算过程-以(a++)*,第1张

在对变量进行运算时,如果表达式运算结果依然对变量自身赋值,如:

a=a+1;a=a*3;a=a-1;

等表达式,我们可以对其进行简写,可以写成:

a+=1;a*=3;a-=1;

上述表达式中的"+="、"*="、"-="叫作复合赋值运算符,在C、C++中,复合赋值运算符还有另外的几个。

对于上述复合赋值运算符中的两种情况,即:a+=1和a-=1,又有进一步的简写:

a++;++a;a--;--a;

其中的运算符"++"称为自加运算符,"--"称为自减运算符,如果仅仅只是对变量a进行单独的运算,运算符放在变量a前面或者放在其后面都没有区别。

只有当变量a需要在表达式中参与运算时,也即需要使用该变量时,才需要区分自增、自减运算符的位置。

1、++a,--a表示在使用a之前,即取a的值参与表达式中的运算之前,先完成自增或自减运算;

2、a++,a--表示在使用之后在对变量a进行自增、自减运算,也即表达式直接取变量a当前的值进行运算,当变量a所在表达式运算结束之后,再完成变量a的自增、自减运算。

综合以上解释,对如下代码:

#include 
int main(void){
    int a,b,c;
    a=2;
    b=3;
    c=(a++)*(b++)*(++a)*(a--)*(--b);
    printf("c=%d\n",c);
    printf("a=%d\tb=%d",a,b);
    retrun 0;
}

先根据上述解释,推测a、b、c运算之后的结果:

由于表达式括号外都是乘法运算,从左往右看就行,现在只需要确定各括号内的值:

a++:表示取a当前值2进行运算,并在整个表达式运算结束进行1次自增;

b++:表示取b当前值3进行运算,并在整个表达式运算结束进行1次自增;

++a:表示将a的当前值加1参与运算,即用a=2+1=3进行运算,此后a的值为3;

a--:表示取a当前值3参与运算,并在整个表达式运算结束进行1次自减;

--b:表示将b的当前值减1参与运算,即用b=3-1=2进行运算,此后b的值为2。

由此可知:c=2*3*3*3*2=108;a=3+1-1=3;b=2+1=3

程序运行结果如下:

可见,结果和推测的结果完全一致。

值得注意的是,推测时是按表达式中运算符的优先级和结合方向逐个计算的,理论上编译器也都是按这个顺序编译的,但我也不确定这一点,望指正!

此外,需要注意不管是哪一种复合赋值运算符,都是针对变量而言的,对于常量不能这么搞。

主要情形:用数组名作为函数的实参和形参时,混淆了数组名和指针变量的用法——

即:如果将指针变量pA指向一个一维数组A[N],那么在进行引用数组元素,比如循环输出所有元素时,可以用下标法进行索引,也可以用指针法,有如下代码:

int main(int argc, char* argv[]) {
	char A[6] = "China";
	char* pA;
	pA = A;

	//第一种:直接用下标索引,人畜无害
	for (int i = 0; A[i] != '//第三种:直接用数组名作为索引,并对数组名进行自增运算,以图改变指向
for (; *(A) != '';) {
	printf("%c", *(A++));
}
printf("\n");'; i++) {
		printf("%c", A[i]);
	}
	printf("\n");

	//第二种:定义指针变量指向数组首元素,往后对指针变量自增运算,以改变指向,这也是正确的
	for (; *(pA) != '';) {
		printf("%c", *(pA++));
	}
	printf("\n");

	system("pause");
	return 0;
}

 上述两种结果如下:

由于数组名A表示数组A[N]的首元素地址,pA最开始也是指向数组A[N]的首元素地址,初学者就容易将二者的用法搞混,误以为也可以用数组名进行同样的 *** 作:

 

可见有如下错误提示:

 以上唯一一个错误的地方就是:"A++",这是因为A作为数组名,代表数组首元素地址,它是一个常量,无法像指针变量pA一样进行自增运算,出现这种错误的原因,无非就是对常量、变量的性质,以及对运算符的功能理解不透彻。

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存