每日一题之 运算符号类型

97 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

写在前面:

唔!!以前断断续续写了一些水文,结果一不小心俺就大三了,本着不能水的原则,开始了刷题之旅,想做一个我刷题的一些有意思的问题。因为是个人理解的,也许有错误,欢迎大家指出。

1666787273612.jpg

正文部分

本期给大家带来的是关于运算符号类型的一些面试题,因为都是牛客遇到的,做记录忘了写来源,唔,大家将就看吧。

问题一:下面代码输出是什么?

void main(){
 int m=3,n=4,x;
 x=-m++;
 x=x+8/++n;
 printf("%d\n",x)
 }

当时我第一次遇到这个题,我觉得思路很清晰吧。有点开胃小菜感觉了!!!

1666787726121.jpg

解决本题的 第一点:明确我们考察的是什么!!

这个题 通过x的不同运算,我们可以知道考察运算符号问题。那么咱们考察的呢?

我们可以看到题目运算符号有:- ++ + / 四种符号的运算优先级是什么呢?

image.png 通过优先级别,我们可以知道,

x=-m++;优先级最高的是 ++。 有同学可能会感到疑惑,x=-m++;如果把 -(减号)看成负号可不可以呢? 其实当然也是可以的。这样我们优先级最高的是 ++ -。 对于同一优先级的多个符号,我们通过结合性来看,本题结合是右到左,即先m++,在-m。

我们知道++ 在后面,那么运算时候m=3,运算完成x=-3,m=4

x=x+8/++n;里面,优先级最高是++,然后是/ 最后是+ 那么运算过程是:

  • x=x+8/++n;
  • x=x+8/5;
  • x=x+1
  • x=-2 在运算时候关键是,分清楚++在前和++在后的区别。

答案 -2

下面代码是否有错,如果没有应该输出什么?

public static void mian(String[] args){
int age=17;
System.out.println("he is"+age<18?"dmc":"zzt"+"!!!!!")
}

本题也是考察运算符号问题,大家觉得应该是什么结果呢?

我们先进行分析。在输出时候,先是字符串"he is",然后字符串和age进行字符串拼接,得到"he is17",然后是大小判断。然后你会惊奇的发现,前面是字符串,后面是int 这玩意怎么比较?

恭喜你,马上要摸到正确答案了,确实没办法比较

所以本题会出现编译报错!!!

有同学会疑惑,为啥表示先算三目运算符!!!

因为在运行时候有应该贪心原则,即最开始从左到右依次开始录入。所以输出最开始是拿到he is+age然后再做小于判断。

假设:题目修改成如下

public static void mian(String[] args){
int age=17;
System.out.println("he is"+(age<18?"dmc":"zzt"+"!!!!!"));

那么叹号会不会输出?

答案是不会,因为我们字符串在编译时候有字符串优化,在计算机眼里"zzt"+"!!!!!"就是"zzt!!!!!" 所以age比18小,走前面输出dmc,不会输出叹号

今天的打卡,结束!!回见