C语言 #include "stdio.h" void main() { int x=1,y; printf("%d",y=++x*++x); } 为什么答案是9不是6呢???

供稿:hz-xin.com     日期:2025-01-13
#include<stdio.h> void main() { int x=1,y; y=++x*++x; printf("%d\n",y); }

谭浩强 C语言程序设计
C语言的运算符可分为以下几类:
1. 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、
自增(++)、自减(--)共七种。
2. 关系运算符:用于比较运算。包括大于(>)、小于(=)、小于等于(<=)和不等于(!=)六种。
3. 逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4. 位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、
位异或(^)、左移(>)六种。
5. 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位
运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6. 条件运算符:这是一个三目运算符,用于条件求值(?:)。
7. 逗号运算符:用于把若干表达式组合成一个表达式(,)。
8. 指针运算符:用于取内容(*)和取地址(&)二种运算。
9. 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10. 特殊运算符:有括号(),下标[],成员(→,.)等几种。C语言的运算符可分为以下几类:
1. 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、
自增(++)、自减(--)共七种。
2. 关系运算符:用于比较运算。包括大于(>)、小于(=)、小于等

运算符的优先级:C语言中,运算符的运算优先级共分为 15 级。1 级最高,15 级最低。
在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符
优先级相同时,则按运算符的结合性所规定的结合方向处理。

自增、自减运算符
自增1,自减1运算符:自增 1 运算符记为“++”,其功能是使变量的值自增 1。
自减 1 运算符记为“--”,其功能是使变量值自减 1。
自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式:
++i i 自增 1 后再参与其它运算。
--i i 自减1 后再参与其它运算。
i++ i 参与运算后,i的值再自增 1。
i-- i 参与运算后,i 的值再自减 1。

解答问题:
x=1为初始化值.
y=++x * ++x;
第一个++x, x=2;
第二个++x, x=3; 同样道理 第一个++x 也=3; 因为x的内存地址不变.第二个++x加了1后=3.第一个++x也会改变自身的值.所以:结果=9
在visual C++6.0编译后结果=9

原因就是运算符优先级的问题,就像楼上说的:逗号运算符的级别最低,比等号还低
所以这个语句:z=x++,y++,++y;实际上等于:(z=x++),(y++),(++y);这样写的话相信楼主就知道为什么z=1了吧
楼主认为z应该是3的原因应该是把z=x++,y++,++y;当成z=(x++,y++,++y);了

我手头没有 C语言编译器 。
刚刚用c# 语言测试了一下。确实输出的是 6,不是9.

又用了C++测试了一下,确实输出的是9,不是6。

我感觉应该不是编译器的问题,这个应该是C++和C#语言不同造成的。
C#语言,由于没有了指针,所以很多内存语言本身就给实例化然后释放掉了。

而C++,就需要就没有C#那样智能。

我感觉应该是这样的,++x 在X进行运算之前,先自增。这样自动之后在进行运算,这时X已经是3了。
计算的时候,C++里,没有自动为 两个++X单独分配空间。 是按照两个3来相乘,所以得9.
而C#里则是把两个++x 先自动给分配一段空间,然后把结果放到这两个空间里在相乘。

这个该是涉及到编译器的问题 不同的编译器的逻辑处理会有不同的,上课老师也说过。。要求我们尽量避开这种输入格式。
我用了 vs2010 运行,输出的是9

不过也相信楼上输出6也是正确的 编译器就不同

结果没有错
++i是先自增再使用 而这里有两个++i
所以i先自增两次 i=3
3*3=9
结果就是这样出来的

因为要先执行自增在运算,就是说x先自增两次即x=3,再算乘法。答案就是9了

#include中用双引号括起来和用尖括号时它们有何区别
#include中用双引号括起来和用尖括号时它们有何区别 双引号表示先在程序源文件所在目录查找,如果未找到则去系统默认目录查找,通常用于包含程序作者编写的头文件; 尖括号表示只在系统默认目录或者括号内的路径查找,通常用于包含系统中自带的头文件; CSS选择器中的空格与尖括号有何区别 空格表示的是后代选择器,尖括号...

编写C语言程序,计算由用户输入的两个分数,求它们的加,减,乘,除._百度...
quo: 32\/27

vc++连接MYSQL数据库
JDBC,ODBC接口。出于性能考虑,我们采用了MySQL的C API进行开发。现以Visual C++ 环境为例,作一简单介绍。--- 新建一Win32 Console Application的Project,把“c:\\mysql\\include”添加到编 译选项的包含路径中(在Project Options中加入 \/I "d:\\mysql\\include&quounter.cgol.net 魈迦缦拢?include ...

C语言字符串类型转换为整型或浮点怎么做
include <stdio.h>#include <string.h>#include <stdlib.h>#define isdigit(c)('0' <= (c) && (c) <= '9')#define MAX_DIGI_NUM 100int _div_16(char *big_num, int *p_size){ int to_div = 0; char *div = big_num; int num_size; char *quo; int rem...

关于一个C语言写的代码无法运行出结果
=0)int_out=0; term_3=redix_2;\/\/quo_2=int_num_2;quo_2=int_out_d;\/\/\/ do{rem_2=quo_2\/redix_2;int_out+=rem_2*term_3;term_3*=redix_2;}while((quo_2\/=redix_2)!=0);\/\/转换n进制小数\/\/\/flo_out=0;term_4=1.0\/10;num_flo_2=flo_out_d;do{num_flo_2...

#include<stdio.h> main()int a,b,t; scanf("%d,%d",&a,&b); if(a...
include<stdio.h> void main(){ int a,b,t;scanf("%d,%d",&a,&b);if(a>b){t=b;b=a;a=t;} printf("%d,%d\\n",a,b); }

C语言1.自己编写程序实现void itoa(int x, char *p)(将数字x,转换为字 ...
include "stdio.h"void itoa(int x,char *p){ int k=0;for(;x>0;x\/=10){ p[k++]=x%10+48;} printf("String for:\\n");for(k--;k>=0;k--){ printf("%c",p[k]); \/\/以%c格式打印每一位数字!} printf("\\n");} void main (int argc,char *argv[]){ printf(...

编写一个2×2矩阵的求逆函数。要求参数为2×2的二维数组,如果输入参数...
\/\/求任何一个矩阵的逆矩阵 \/\/ include <stdio.h> include <malloc.h> void main( void ){ float *buffer,*p; \/\/定义数组首地址指针变量 short int row,num; \/\/定义矩阵行数row及矩阵元素个数 short int i,j;float determ; \/\/定义矩阵的行列式 float comput_D(float *p,short int ...

求助, 约瑟夫环问题(C语言)
include<stdio.h> include<malloc.h> typedef struct node{ int num;int val;struct node* next;}listnode;\/\/两个结构体可以合并以减少程序复杂度 typedef listnode* linklist;int main(){ int n,i,b,m,j;linklist q=(listnode*)malloc(sizeof(listnode));q->next=q;\/\/即使只有一个元素,...

这个链接下的源代码是什么?