首页 > 软件 > 以下程序的运行结果是多少,为啥呀

以下程序的运行结果是多少,为啥呀

软件 2022-05-15

请问下面程序的运行结果是什么?为什么?

输出结果:9,11,9,10 首先,声明了四个变量i,j,m,n i赋值8; j赋值10; m等于i自增1。所以,m现在等于9,i等于9; n等于j自增1。所以,n现在等于10,j等于11; 输出语句,格式化输出四个变量的值。 最后函数执行结束返回0 你可能会问,为什么m=++i,m等于9。而n=j++,n就等于10了(为什么n等于原来j的值没有+1),这是因为++的问题 变量名++ 是后计算 ++变量名 是优先计算 比如你int a=i++; 就会先把i的值给a再将i进行自增 而int a=++i; 则会先将i进行自增,然后赋值给a

这个程序的运行结果是多少?为什么?

main()
{
unsignedchara=0xA5;//无符号16进制数a5,二进制就是10100101
unsignedcharb=~a>>4+1;//先算术,后移位,最后位运算等价于b=~(a>>(4+1))
//b=~(a>>5)=~(00000101)=(11111010)
printf("%d",b);//输出格式为%d,为无符号数,按照补码(Two'scomplement)的原理
//11111010就是0xfa也就是250
getch();
}

我之前的答案是错的~按位取反为单目运算符号,优先级别最高,因此

计算优先级如下 b = (~a) >> (4+1) = (~a) >> 5

(~a) 这是个比较困扰人的地方,

如果你的编译环境中将char升为int处理的话,答案就是

(~ 0000 0000 1010 0101) = (1111 1111 0101 1010)

(~ a) >> 5 就是 0000 0111 1111 1010

但是的b也是unsigned char类型,所以赋值后b = 0000 0000 1111 1010 = 250(10进制)


如果你的编译环境是其他的时候,结果有可能就是

(~a) >> 5 = ( ~ 1010 0101)>>5 = (0101 1010)>>5 = (0000 0101)

b = (0000 0101) = 5


更新,我用GDB调试了下,发现了很奇怪的的东西,或许可以解释(~a)为什么会是32位额int形式,unsigned char在做(~a)升位成了32位

unsigned char a =0xa5;

char a2 = 0xa5;


在GDB里面设置断点,然后

p /x ~a

p /x ~a2

结果如下


GNU gdb (GDB) 7.6.1

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "mingw32".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from C:\Users\Komax\ds\test1.exe...done.

(gdb) l

1 #include

2

3

4 int main(){

5 unsigned char a = 0xa5;

6 char a2 =0xa5;

7 unsigned char b = ~a >> 4 + 1;

8 printf("%u\n", b);

9 printf("%x\n", b);

10 return 0;

(gdb) b 9

Breakpoint 1 at 0x40141b: file test1.c, line 9.

(gdb) r

Starting program: C:\Users\Komax\ds/test1.exe

[New Thread 3064.0x73c]

250


Breakpoint 1, main () at test1.c:9

9 printf("%x\n", b);

(gdb) p /x a

$1 = 0xa5

(gdb) p /x ~a

$2 = 0xffffff5a

(gdb) p /x ~a2

$3 = 0x5a

(gdb) p /x ~a2

$4 = 0x5a

(gdb)

C语言以下程序的运行结果是

函数sub中的引入参数是是形式参考,比方说第一个sub(x3, x4); 函数最先执行的语句是:int x = x3, int y = x4;//把x3跟x4的值赋给x跟y 所以函数里面改变的是x跟y的值,而x跟y在函数结束后就被清除了,所以受改变的只有全局变量x1,第一次执行sub的时候, x = x3; x1 = x;//x1==10; 同理,第二次的时候x1的值就等于x2了,所以x1最终值为40,其他值不变,输出结果是: 10, 20, 40, 40

下面程序的执行结果是什么?为什么?

1.C 子类重新实现了虚函数 2.BC' constructor DC' constructor DC' destructor BC' destructor 继承类构造顺序为先父类后子类,而析构顺序则相反 3.会发生编译错误(你确定没写错?) 函数没有实现声明,即使声明仍然会有Warning(最好把原先数组声明为const char* pn[],相应的函数参数类型也要改变) 4.D::func() called 子类重新实现了虚函数

下面程序的执行结果是什么?为什么?

因为构造函数先调用基类,然后子类。而析构先调用子类,然后基类,所以输出: B b; 输出In class base (先调用基类构造函数),然后输出In class base(派生类A的构造函数),而B的构造函数没有额外输出。 b.fc(); 输出In class B base *p=new A; 输出In class base (先调用基类构造函数),然后输出In class base(派生类A的构造函数) p->fc(); 输出In class base(派生类的输出),因子类A没有覆盖基类的fc() [我不确定是否笔误为f()] delete p; 因A析构没有做事,输出Destruct

标签:编程 计算机 编程语言 电脑网络 C语言

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved.