运算符优先级
#include <stdio.h>
int main()
{
//逗号运算符
//逗号运算符优先级最低,10先结合占位符
printf("%d\n",10, 20, 30); //10
//加上括号是一个整体,自左向右最后结果为30
printf("%d\n", (10, 20, 30)); //30
//其实运算符优先级很重要,但是写代码可读性在99%的情况下更重要
//代码虽然是给机器用的,可始终还是给人看的,尽可能的用()使运算顺序一目了然
//对于运算符优先级我也只是记住() [] . ->在第一梯队
//*优先级要高于&
//=只比,高
//! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
return 0;
}
本来想着在CSDN上随便找一个图贴上来,然后真就随便找了一个.
突然想带一句话,在这个充满信息的时代,如果没有分辨信息真伪的能力,还不如做一个瞎子!
当然我一点也不权威,我记录这些只是为了做笔记而已,发现错误我会改.如果能帮到其他人我很荣幸,如果我错了,对你产生了误导真的很抱歉.
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 | 1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | | () | 圆括号 | (表达式)/函数名(形参表) | | . | 成员选择(对象) | 对象.成员名 | | -> | 成员选择(指针) | 对象指针->成员名 | | 2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 | (类型) | 强制类型转换 | (数据类型)表达式 | | ++ | 前置自增运算符 | ++变量名 | 单目运算符 | ++ | 后置自增运算符 | 变量名++ | 单目运算符 | -- | 前置自减运算符 | --变量名 | 单目运算符 | -- | 后置自减运算符 | 变量名-- | 单目运算符 [4]? | * | 取值运算符 | *指针变量 | 单目运算符 | & | 取地址运算符 | &变量名 | 单目运算符 | ! | 逻辑非运算符 | !表达式 | 单目运算符 | ~ | 按位取反运算符 | ~表达式 | 单目运算符 | sizeof | 长度运算符 | sizeof(表达式) | | 3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 | * | 乘 | 表达式*表达式 | 双目运算符 | % | 余数(取模) | 整型表达式/整型表达式 | 双目运算符 | 4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 | - | 减 | 表达式-表达式 | 双目运算符 | 5 | | 左移 | 变量 | 左到右 | 双目运算符 | >> | 右移 | 变量>>表达式 | 双目运算符 | 6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 | >= | 大于等于 | 表达式>=表达式 | 双目运算符 | | 小于 | 表达式 | 双目运算符 | | 小于等于 | 表达式 | 双目运算符 | 7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 | != | 不等于 | 表达式!= 表达式 | 双目运算符 | 8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 | 9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 | 10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 | 11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 | 12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 | 13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 | 14 | = | 赋值运算符 | 变量=表达式 | 右到左 | | /= | 除后赋值 | 变量/=表达式 | | *= | 乘后赋值 | 变量*=表达式 | | %= | 取模后赋值 | 变量%=表达式 | | += | 加后赋值 | 变量+=表达式 | | -= | 减后赋值 | 变量-=表达式 | | | 左移后赋值 | 变量 | | >>= | 右移后赋值 | 变量>>=表达式 | | &= | 按位与后赋值 | 变量&=表达式 | | ^= | 按位异或后赋值 | 变量^=表达式 | | |= | 按位或后赋值 | 变量|=表达式 | | 15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | 从左向右顺序运算 |
if,if else,if else if else
#include <stdio.h>
int main()
{
//if语句
//当同时只需要一种结果时 if
int num = 3;
//哦!对了在C语言中一个=表示赋值,两个==表示逻辑,这个很重要,我刚学时也会在这里犯错
//现在也经常手误,写错,可以写成 0 == num % 2 这样写如果手误写成 0 = num % 2 编译器会不通过 因为不能给常量赋值
//条件不成立,会直接跳过这条语句,大括号很重要别看别人不写你也不写,代码的可读性在99%的情况下都是第一位
if (num % 2 == 0)
{
printf("num %% 2 == 0\n"); //不会执行
}
//当同时需要两种结果二选一的时候 if else
if (num % 2 == 0)
{
printf("num %% 2 == 0\n"); //不会执行
}
else
{
printf("num %% 2 != 0\n"); //会执行这条语句
}
//当同时需要多种结果多选一时 if else if else
int num2 = 5;
if (num2 % 3 == 0)
{
printf("num2 %% 3 == 0\n"); //不会执行
}
else if(num2 % 3 == 1)
{
printf("num2 %% 3 == 1\n"); //不会执行
}
else if (num2 % 3 == 2) //if可以不写,但是如果只有这三种情况下还是写上为好,还是那句话代码是给人看的
{
printf("num2 %% 3 == 2\n"); //会执行这条语句
}
//当不同时需要多种结果多选多时 if
//下面三条语句都会执行
int num3 = 6;
if (num3 % 3 == 0)
{
printf("num3 %% 3 == 0\n");
}
if (num3 % 2 == 0)
{
printf("num3 %% 2 == 0\n");
}
if ((num3 % 3 == 0) && (num3 % 2 == 0))
{
printf("num3 %% 3 == 0,num3 %% 2 == 0\n");
}
return 0;
}
switch
#include <stdio.h>
int main1()
{
//switch
//switch可以一选一 一选多 多选一 多选多
//switch的参数必须时整型或字符型(其实字符型也是整型,个人一直是这么认为的)
//不能是浮点型,字符串
int select = 0;
printf("enter select:");
scanf_s("%d", &select);
//一选一
switch (select)
{
//输入1执行case 1
case 1:
{ //这个大括号可加可不加,根据编译器决定,还是加上为好,少踩坑
printf("1\n");
//break必须加否会继续向下执行每条语句,直到遇到break或switch结束
//也就可以多选多一选多
break;
}
//输入2执行case 2
case 2:
{
printf("2\n");
break;
}
//输入3执行case 3
case 3:
{
printf("3\n");
break;
}
//其他输入执行default
default:
printf("other\n");
break;
}
return 0;
}
int main2()
{
int select = 0;
printf("enter select:");
scanf_s("%d", &select);
//一选多
switch (select)
{
//输入1执行case 1
case 1:
{
printf("1\n"); //此处没有break
}
//输入1执行case 2
case 2:
{
printf("2\n");
break;
}
//输入3执行case 3
case 3:
{
printf("3\n");
break;
}
//其他输入执行default
default:
printf("other\n");
break;
}
return 0;
}
int main()
{
char select = 0;
printf("enter select:");
scanf_s("%c", &select, 1);
//多选一 多选多
switch (select)
{
//输入a或A 执行printf("a,A\n");
case 'a':
case 'A':
{
printf("a,A\n");
break;
}
//输入cC执行printf("c,C\n");和printf("B,b\n");
case 'c':
case 'C':
{
printf("c,C\n");
}
case 'B':
case 'b':
{
printf("B,b\n");
break;
}
default:
printf("other\n");
break;
}
return 0;
}
for
#include <stdio.h>
int main(int argc, char** argv)
{
//for 其实没啥可说的
/*for (初始条件;循环条件;循环步数)
* {
* 循环语句;
* }*/
//执行步骤
//初始条件->循环条件->循环语句->循环步数->循环条件->循环语句
//初始条件执行一次,然后判断循环条件符合执行循环语句,然后增加步数,判断循环条件.....
//那个术语不是这些,但是无关紧要.....
//前置++比后置++效率高,因为后置++会多执行指令(基本然并卵)
int sum = 0;
for (int i = 1; i <= 100; ++i)
{
sum += i;
}
printf("sum = %d\n", sum); //5050
//continue结束当前循环,执行下次循环
sum = 0;
for (int i = 1; i <= 100; ++i)
{
//如果i为1会结束当前循环执行下次循环,本次循环不会执行sum += i;
if (i == 1)
{
continue;
}
sum += i;
}
printf("sum = %d\n", sum); //5049
//break跳出循环
sum = 0;
for (int i = 0; i <= 100; ++i)
{
break; //直接跳出循环
sum += i;
}
printf("sum = %d\n", sum); //0
return 0;
}
while
#include <stdio.h>
int main(int argc, char** argv)
{
//while
int sum = 0;
int i = 1;
//任何循环都要注意退出条件
//执行顺序就是自上向下
fly:while (i <= 100)
{
sum += i;
++i;
}
printf("sum = %d\n", sum);
//do while
//会先执行一次循环语句,在判断
i = 1;
do
{
printf("循环条件不满足,也会执行一次\n");
} while (i != 1);
//goto(不建议使用)
goto fly; //每次执行到这,就会跳转到fly位置,这个程序会死循环
return 0;
}
//还有一个需要说一下,十六进制输出的时候没有正负之分,他输出的是补码,也就是计算机存储的形式.
|