2019.3.7 反思, 测试C语言基本功到底好不好?

下午上了VC++课,老师念完PPT,由于C++是在C上++的,我不屑于听他讲课,刷着最右,他出了几道很简单但很基础的代码题,我抬头看了看,很基础的题,真的很基础。但是我没算出正确答案。

 int a(3),b(4),c;
    c=a>b?++a:++b;
    cout<<c<<endl;
    cout<<a<<b<<endl;
    c=a-b?a+b:a-3?b:a;
    cout<<c<<endl;
    c=a-b?a+b:(a-3?b:a);

看下这段代码

考得很基础。

首先,看第一个C=………………

    c=a>b?++a:++b;

a为3,b为4,当然?前面是false,所以执行++b。

此时a为3,b为5.

看第二个C=………………

c=a-b?a+b:a-3?b:a;

其实吧,第二个C……和第三个C……是一样的,因为结合性是从右向左结合的。

c=a-b?a+b:(a-3?b:a);

a-3为0,逻辑假,选择冒号后面的a,括号里面是a的值3;

然后,再算a-b为-2,为真,选择冒号前面的a+b

所以c=a+b=3+5=8

很基础,但我但是就是算不出来,想想还是自己心浮气躁

沉不下来,太浮躁了,什么事也做不成。

 再看几个例子

1.

int i=3,j=0,a;
    a=(i+j)&&i++;
    cout<<a<<" "<<i<<endl;

这个比较简单,&&左边为3,右边为3

同时为真,a也为真,即1.

a为1

i为4

2.

int i=3,j=0,a;
    a=(i+j)||i++;
    cout<<a<<" "<<i<<endl;

这个,大多数人会认为,输出a为1,i为4,其实不然

||这个运算符:只要他左边或右边只要有一个为真,a就为真,当i+j为三时,这时,他左边已经为1了,无需判断他右边是否为1,

所以,没有执行i++。所以i为3.

3.

int i=3,j=0,a;
   a=(i++)+(i++);
   cout<<a<<" "<<i<<endl;

这个在Dev上输出是7,5,在vc上是6,5

i是后增量,执行后,加两次。

4.

int i=3,j=0,a;
   a=(++i)+(++i);
   cout<<a<<" "<<i<<endl;

这个是在执行a……这一行之前把i++了两次。i=5,再执行a=……这一行

10,5

5.

int i=3,j=0,a;
   a=(i++)+(++i);
   cout<<a<<" "<<i<<endl;

执行之前,由于有++i,i=4,a=两个i相加,执行之后,i又加了一次。8,5

还是小学那句话,虚心使人进步,董明珠说过:战战兢兢,如履薄冰,才能做好每一件事。

沉下来,在大学里,拼命地吸收知识的养分。

猜你喜欢

转载自blog.csdn.net/qq_41325698/article/details/88313361