在C/C++中int main()、void main()、int main(void)和void main(void)之间有什么意义区别

一、主函数也是函数

首先我们要了解C/C++中函数的定义,因为main函数也是函数,与其他函数的区别只是主函数是程序的主线而已,程序从它开始也在其中结束。一个函数由函数名、其前的类型标识符、其后小括号里声明的参数类型和参数名(这里的参数叫形参,即形式参数或虚拟参数)以及大括号里的函数主体构成。主函数main也不例外。

二、main前面用int还是void?

main前面的是类型标识符,也就是类型名,其决定的是函数返回值的类型,int指有返回值且返回值为整形,void表示“空”即没有返回值。

很多时候函数是不需要返回值的,只作为语句执行就完成任务了,比如主函数main常常就是;有返回值的函数通常出现在表达式中,如int i=rand();rand()返回一个随机值替代自身位置赋值给i,有返回值的函数定义其返回值类型可以各式各样,有int有char有float有double。

对于主函数,我们常常只要程序执行它,并不需要它的返回值,所以有人用int main加上return 0,有的直接用void main。但最后制定标准的人说了:‘main’ must return ‘int’,其他的乱七八糟的返回值类型都不行,void也不行,以此盖棺定论。只能返回int,这大概就是main作为一个主函数的尊严,本身没什么意义就是,毕竟return 0都不需要你自己加,编译器就代劳了。

所以对于其他花花绿绿的函数,主函数main前只能加int(就好比主函数只能用main表示一样,只是这么规定而已),老的编译器可能还能用void,但现在的严谨的编译器大多默认int,用void会报错。

顺便说一句,void main()或void main(void)是写程序的人根据函数原型自行发明的,C和C++标准中可从来没有定义过void main。

再偷偷告诉你,如果你受不了强权的话你可以直接用main()省略int,不过这也只是以前的写法,早晚会在渐渐的标准化中被淘汰,当然编译器是不大会报错的就是了。

三、int main()的小括号里加不加void?

有参数的要写上对应数目的参数数据类型和参数名,没有参数的就不写或写上void,大多数情况下main是不需要参数的。

那么写上void如何?不如何,很好,非常正确。用int main(void)这种写法非常标准,当然用int main()也是被广泛接受的,两者都表示本主函数没有参数,以C和C++标准来看都是正确的。

四、在int main()后的主体里面能不能出现非int类型的的东西?

不论返回值数据类型或者参数数据类型如何都不影响你在函数(不论主函数还是其他函数)主体内使用其他各种数据类型。

上一个奇葩程序:

#include<iostream>
int main()
{  
    float a;
    double b;
    char c;
    float xy(short x,double y,int z);//函数定义在主函数之前时可省略此声明语句。
    std::cout<<xy(1,1,1);
}
float xy(short x,double y,int z)
{
    float a=3.1;
    char b='a';
    int c=1;
    return a;//最好返回的值对应float数据类型,否则会将对应二进制码按float规则强制转换,至于报错是不可能报错的。
}

五、总结

在C/C++中声明主函数要么写成int main(),要么写成int main(void)。main()、void main()和void main(void)这三种写法尽量放弃。

根据链接中的内容,对于括号的操作主要是通过栈来实现的。具体步骤如下: 1. **初始化**: - 创建两个栈 `translatedLanguage` `finalInterp`,分别用于存储经过大小写转换后的语言每个大写字母的最终解释。 2. **输入预处理**: - 读取输入的魔王语言字符串 `language`。 - 计算字符串的长度 `langLength`。 3. **处理大写字母**: - 遍历字符串 `language`,对于每一个大写字母,如果它还没有被解释过(即 `test[Char - 'A'][0] == '\0'`),调用 `inputAndCheck` 函数获取其解释并存储在 `test` 数组中。 4. **将字符串逆置并入栈**: - 使用 `reverseInvert` 函数将整个字符串逆置并逐个字符压入栈 `translatedLanguage` 中。 5. **处理栈中的字符**: - 从栈 `translatedLanguage` 中逐个弹出字符,根据字符的不同类型进行不同的处理: - 如果是大写字母,将其对应的解释字符串逆置并逐个字符压入栈 `translatedLanguage` 中。 - 如果是右括号 `)`,设置标志 `flag` 为 `true`,表示接下来的字符是在括号内。 - 如果是左括号 `(`,设置标志 `flag` 为 `false`,并将括号内的字符按照特定规则重新排列并压入栈 `translatedLanguage` 中。 - 如果是普通字符,根据标志 `flag` 决定将其加入到 `inBrackets` 或 `translation` 中。 6. **生成最终翻译**: - 将 `translation` 字符串逆置并输出。 以下是关键函数的实现: ### `reverseStr` 函数 ```c void reverseStr(char str[], int length) { int start = 0; int end = length - 1; while (start < end) { swap(str[start], str[end]); start++; end--; } } ``` ### `invert` 函数 ```c void invert(Stack &sta, char sentence[]) { int len = strlen(sentence); for (int i = len - 1; i >= 0; --i) { sta.push(sentence[i]); } } ``` ### `reverseInvert` 函数 ```c void reverseInvert(Stack &sta, char sentence[]) { int len = strlen(sentence); for (int i = 0; i < len; ++i) { sta.push(sentence[i]); } } ``` ### `inputAndCheck` 函数 ```c void inputAndCheck(Stack &sta, char ch, int index, char test[26][MAX_SIZE]) { char supperVoca[MAX_SIZE]; int vocaVal; char final[MAX_SIZE]; printf("请输入%c字符的解释", ch); scanf("%s", supperVoca); for (int i = 0; i < strlen(supperVoca); i++) { vocaVal = supperVoca[i]; if (isupper(vocaVal) && test[vocaVal - 'A'][0] == '\0') { if (vocaVal - 'A' != index) { Stack newSta; inputAndCheck(newSta, supperVoca[i], vocaVal - 'A', test); } } if (isupper(vocaVal) && test[vocaVal - 'A'][0] != '\0') { reverseInvert(sta, test[vocaVal - 'A']); } else { sta.push(supperVoca[i]); } } int i = 0; while (!sta.isEmpty()) { char tmp = sta.top(); sta.pop(); final[i] = tmp; i++; } reverseStr(final, i); int j = 0; while (j < i) { test[index][j] = final[j]; j++; } test[index][j] = '\0'; } ``` ### `main` 函数 ```c int main() { char test[26][MAX_SIZE]; char language[MAX_SIZE]; char inBrackets[MAX_SIZE]; char translatedInBra[MAX_SIZE]; char translation[MAX_SIZE]; bool flag = false; Stack translatedLanguage; Stack finalInterp; for (int i = 0; i < 26; ++i) { test[i][0] = '\0'; } scanf("%s", language); int langLength = strlen(language); for (int i = 0; i < langLength; i++) { int Char = language[i]; if (isupper(Char)) { if (test[Char - 'A'][0] == '\0') { inputAndCheck(finalInterp, language[i], Char - 'A', test); } } } reverseInvert(translatedLanguage, language); int i = 0; int j = 0; while (!translatedLanguage.isEmpty()) { char tmp = translatedLanguage.top(); translatedLanguage.pop(); if (isupper(tmp)) { reverseInvert(translatedLanguage, test[tmp - 'A']); } else if (tmp == ')') { flag = true; } else if (tmp == '(') { flag = false; int inBracketsLength = strlen(inBrackets); int counter1 = 0; int counter2 = 0; while (counter1 != inBracketsLength) { translatedInBra[counter2] = inBrackets[inBracketsLength - 1]; if (counter1 != (inBracketsLength - 1)) { translatedInBra[counter2 + 1] = inBrackets[counter1]; } counter1 = counter1 + 1; counter2 = counter2 + 2; } reverseInvert(translatedLanguage, translatedInBra); } else { if (flag) { inBrackets[i] = tmp; i = i + 1; } if (!flag) { translation[j] = tmp; j++; } } } reverseStr(translation, j); for (int k = 0; k < j; k++) { printf("%c", translation[k]); } return 0; } ``` 以上代码实现了对括号内字符的特殊处理,并将整个魔王语言字符串转换成人类语言。希望这些信息对你有所帮助!如果你有任何问题,欢迎继续提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值