有关三目运算符总目录点这里;
三目运算符大法好
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define ll long long #define re register using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int x; char c1[5]={‘a‘,‘p‘,‘p‘,‘l‘,‘e‘}; char p1[6]={‘a‘,‘p‘,‘p‘,‘l‘,‘e‘,‘s‘}; int main() { x=read(); printf("Today, I ate %d %s.",x,x>=2?p1:c1); }
完结。
个鬼啊?这题没完呢;
这里涉及很重要的知识:
这份代码的输出以及判定条件没问题,char数组确认没问题,但是,当我们带入1的时候,我们会发现系统给我们了这样一个答案:
再确认一遍,三目运算符判定没有问题。
于是我叫来了同机房的巨佬们一起研究错在哪里,甚至通过摄像头惊动了教练
然而没找出来哪里错了。
后来多方求助,找了出来:
c1,p1数组开小了,我开的是正好卡大小上界的。然而在这个字符串的结尾会自动保存一个\0作为结束符号。而我的数组恰恰少了那一个符号,于是在访问的时候,内存访问溢出了,访问到下一个字符串的存储地址(很明显系统把他俩的内存地址安排到一块了),就认定为一个字符串一起输出了。。。
打个红题还能找出自己基础知识的不足
正确代码:
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #define ll long long #define re register using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int x; char c1[10]={‘a‘,‘p‘,‘p‘,‘l‘,‘e‘};//开大一点没坏处 char p1[10]={‘a‘,‘p‘,‘p‘,‘l‘,‘e‘,‘s‘}; int main() { x=read(); printf("Today, I ate %d %s.",x,x>=2?p1:c1); }
真正完结撒花。