C 언어(C)의 연산, 연산자 및 표현식. 조건식 si의 부정

관계 및 논리 연산자

표기법으로는 관계 연산자그리고 논리 연산자용어 관계두 가지 의미 사이에 존재할 수 있는 관계를 의미하며, 논리적- 논리값 "true"와 "false" 사이의 관계. 그리고 관계 연산자는 참 또는 거짓 결과를 생성하므로 논리 연산자와 함께 사용되는 경우가 많습니다. 이러한 이유로 그들은 함께 고려됩니다.

다음은 관계 연산자입니다.

논리 연산자에는 다음이 포함됩니다.

관계형 또는 논리 연산자를 실행한 결과는 bool 유형의 부울 값입니다.

일반적으로 관계 연산자 == 및 !=를 사용하여 객체의 동등성 또는 불평등성을 비교할 수 있습니다. 그리고 비교 연산자인 =는 순서 관계를 지원하는 데이터 유형에만 적용될 수 있습니다. 따라서 관계 연산자는 모든 숫자 데이터 유형에 적용될 수 있습니다. 그러나 bool 값은 true 값과 false 값의 순서가 지정되지 않으므로 동등성 또는 불평등 여부만 비교할 수 있습니다. 예를 들어 C#에서 true > false 비교는 의미가 없습니다.

관계형 및 논리 연산자의 사용을 보여주는 예제 프로그램을 살펴보겠습니다.

시스템 사용; System.Collections.Generic을 사용합니다. System.Linq 사용; System.Text 사용; 네임스페이스 ConsoleApplication1 ( 클래스 Program ( static void Main(string args) ( short d = 10, f = 12; bool var1 = true, var2 = false; if (d f) Console.WriteLine("d > f"); // 비교 변수 var1 및 var2 if (var1 & var2) Console.WriteLine("이 텍스트는 인쇄되지 않습니다."); if (!(var1 & var2)) Console.WriteLine("!(var1 & var2) = true"); var2) Console.WriteLine("var1 | var2 = true"); if (var1 ^ var2) Console.WriteLine("var1 ^ var2 = true");

C#의 논리 연산자는 가장 일반적인 논리 연산을 수행합니다. 그럼에도 불구하고 형식논리의 규칙에 따라 수행되는 연산이 많이 있습니다. 이러한 논리 연산은 C#에서 지원되는 논리 연산자를 사용하여 구성할 수 있습니다. 결과적으로 C#은 암시를 포함하여 거의 모든 논리 연산을 구성하는 데 충분한 논리 연산자 집합을 제공합니다. 함축왼쪽 피연산자가 참이고 오른쪽 피연산자가 거짓인 경우에만 결과가 거짓인 이항 연산입니다. (함축의 작동은 다음 원칙을 반영합니다. 진실은 거짓을 암시할 수 없습니다.)

논리연산자의 조합을 바탕으로 함축연산을 구성할 수 있습니다! 그리고 |:

단축된 논리 연산자

C#은 또한 특별한 기능을 제공합니다. 단축된, 보다 효율적인 코드를 생성하도록 설계된 논리 연산자 AND 및 OR의 변형입니다. 다음의 논리 연산 예를 사용하여 이를 설명하겠습니다. 논리 AND 연산의 첫 번째 피연산자가 거짓이면 두 번째 피연산자의 값에 관계없이 그 결과는 거짓이 됩니다. 논리 OR 연산의 첫 번째 피연산자가 true이면 두 번째 피연산자의 값에 관계없이 결과가 true가 됩니다. 이러한 연산에서는 두 번째 피연산자의 값을 계산할 필요가 없기 때문에, 시간을 절약하고 코드 효율성을 높입니다..

단축된 논리 AND 연산은 다음을 사용하여 수행됩니다. 운영자 &&, 단축된 논리 OR 연산은 다음을 사용하여 수행됩니다. 연산자 ||. 이러한 단축 논리 연산자는 일반 논리 연산자 & 및 |에 해당합니다. 단축 논리 연산자와 일반 연산자의 유일한 차이점은 두 번째 피연산자가 필요할 때만 평가된다는 것입니다.

모든 언어 표현은 연산 기호로 연결된 피연산자(변수, 상수 등)로 구성됩니다. 연산 기호는 컴파일러에게 특정 산술, 논리 또는 기타 연산을 수행하도록 지시하는 기호 또는 기호 그룹입니다.

작업은 엄격한 순서로 수행됩니다. 특정 작업을 수행하는 우선순위 권한을 결정하는 값을 우선순위라고 합니다. 테이블에 2는 SI(C) 언어의 다양한 연산을 나열합니다. 각 그룹의 우선순위는 동일합니다(그룹은 색상으로 강조 표시됨). 해당 운영 그룹이 더 많은 이점을 누릴수록 테이블에서 더 높은 위치에 위치합니다. 작업 순서는 괄호를 사용하여 제어할 수 있습니다.

표 2 - 작업

작업 표시

운영 목적

함수 호출

배열 요소 선택

레코드 요소 선택

레코드 요소 선택

논리적 부정

비트 부정

기호 변경

1씩 증가

1씩 감소

주소 가져오기

연락처

유형 변환(예: (float)a)

크기(바이트) 결정

곱셈

나눗셈의 나머지 부분 결정

덧셈

빼기

왼쪽으로 이동

오른쪽으로 이동

미만

작거나 같음

이상

더 많거나 같음

비트 논리 "AND"

비트 배타적 "OR"

비트 논리 "OR"

논리 "AND"

논리적 "OR"

조건부(삼항) 연산

과제

+=, - =, *=, /=, %=, <<=,
>>=, &=, |=, ^=

이진 연산(예: a *= b
(즉, a = a * b) 등)

쉼표 연산

C 언어의 연산자(C)

"연산"과 "연산자" 개념의 혼동을 피하기 위해 연산자는 프로그램의 가장 작은 실행 단위라는 점에 유의하세요. 주어진 표현식을 평가하는 효과가 있는 표현식 연산자(예: a = sin(b)+c; j++;), 선언 연산자, 복합 연산자, 빈 연산자, 레이블 연산자, 루프 연산자 등이 있습니다. SI(C) 언어에서는 세미콜론을 사용하여 문의 끝을 나타냅니다. 여는(()과 닫는()) 중괄호("문 중괄호") 사이에 배치된 논리적으로 관련된 명령문 세트인 복합 명령문(또는 블록)의 경우 세미콜론이 뒤에 오지 않습니다. 블록은 블록 본문에 정의가 있다는 점에서 복합문과 다릅니다.

C 언어의 기본 동작의 특징 (C)

SI(C) 언어의 기본 동작을 특성화해 보겠습니다.

할당 연산자

먼저 그 중 하나인 대입 연산자(=)를 살펴보겠습니다. 형태의 표현

변수 x에 변수 y의 값을 할당합니다. "=" 연산자는 하나의 표현식에서 여러 번 사용될 수 있습니다. 예를 들면 다음과 같습니다.

x = y = z = 100;

단항 연산과 이항 연산이 있습니다. 첫 번째에는 피연산자가 하나 있고 두 번째에는 두 개가 있습니다. 다음과 같은 전통적인 그룹 중 첫 번째 그룹으로 분류된 작업부터 살펴보겠습니다.

산술 연산.

논리 및 관계 작업.

비트를 사용한 작업.

산술 연산은 +, -, *, /, % 기호로 지정됩니다(표 2). 마지막은 실제 유형의 변수에 적용할 수 없습니다. 예를 들어:

a = b + c;
x = y - z;
r = t * v;
s = k/l;
p = q%w;

논리 연산

논리적 관계 연산은 다음 기호로 지정됩니다(표 2 참조): &&("And"), || ("또는"), ! ("아님"), >, >=,<, <= , = = (равно), != (не равно). Традиционно эти операции должны давать одно из двух значений: истину или ложь. В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже приводится таблица истинности для логических операций.

비트 연산은 int, char 및 해당 변형(예: long int) 유형의 변수에 적용될 수 있습니다. float, double, void 유형(또는 더 복잡한 유형)의 변수에는 적용할 수 없습니다. 이러한 연산은 다음 기호로 지정됩니다: ~(비트 부정),<< (сдвиг влево), >>(오른쪽 시프트), &(비트 AND), ^(비트 XOR), | (비트 "OR").

예: a=0000 1111이고 b=1000 1000이면

~a = 1111 0000,
ㅏ<< 1 = 0001 1110,
a >> 1 = 0000 0111,
a & b = 0000 1000,
a^b = 1000 0111,
| b = 1000 1111.

이 언어는 증가(++)와 감소(--)라는 두 가지 비전통적인 연산을 제공합니다. 이는 피연산자의 값을 1씩 증가 및 감소시키도록 설계되었습니다. 연산자 ++ 및 --는 피연산자 앞이나 뒤에 쓸 수 있습니다. 첫 번째 경우(++n 또는 --n)에서는 피연산자(n)의 값이 해당 표현식에 사용되기 전에 변경되고, 두 번째 경우(n++ 또는 n--)에서는 사용 후에 변경됩니다. 다음 두 가지 프로그램 라인을 고려하십시오.

a = b + C++;
a1 = b1 + ++c1;

b = b1 = 2, c = c1 = 4라고 가정합니다. 그런 다음 작업을 수행한 후 a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1 = 5입니다.

또 다른 비전통적인 삼항 또는 조건 연산자를 사용한 표현식도 널리 퍼져 있습니다. 공식에서

x가 0이 아니면(즉, 참) y = a이고, x가 0(거짓)이면 y = b입니다. 다음 표현

y = (a>b) ? 가: ㄴ;

변수 y에 더 큰 변수(a 또는 b)의 값을 할당할 수 있습니다. y = 최대(a, b).

언어의 또 다른 차이점은 a = a + 5; a += 5;와 같은 다른 형식으로 작성할 수 있습니다. + 기호 대신 다른 이진 연산 기호를 사용할 수도 있습니다(표 2 참조).

테이블의 기타 작업. 2에 대해서는 다음 단락에서 설명한다.

루프는 특정 명령문이나 명령문 그룹을 지정된 횟수만큼 실행하도록 구성됩니다. SI(C) 언어에는 for, while 및 do - while이라는 세 가지 반복문이 있습니다. 첫 번째는 공식적으로 다음과 같이 작성됩니다.

for(식_1; 식_2; 식_3) loop_body

루프의 본문은 중괄호( ... )로 묶인 하나의 명령문 또는 여러 명령문으로 구성됩니다(블록 뒤에는 세미콜론이 없습니다). 표현식 1, 2, 3에는 제어 변수라는 특수 변수가 포함되어 있습니다. 해당 값에 따라 주기를 반복할지 또는 종료할지 여부가 결정됩니다.

Expression_1은 제어 변수에 초기 값을 할당하고, Expression_3은 각 단계에서 이를 변경하며, Expression_2는 루프를 종료해야 하는지 여부를 지정하는 제한 값에 도달했는지 확인합니다.

(i = 1; 나는< 10; i++)

for (ch = "a"; ch != "p";) scanf ("%c", &ch);

/* 키보드가 나올 때까지 루프가 실행됩니다.

문자 "p"는 입력되지 않습니다 */

세 가지 표현식 중 하나라도 for 루프에서 누락될 수 있지만 세미콜론은 남아 있어야 합니다. 따라서 for (; ;) (...)는 다른 방법으로만 종료할 수 있는 무한 루프입니다.

SI(C) 언어에서는 다음 규칙이 허용됩니다. 괄호로 묶인 모든 할당 표현식에는 할당 값이 있습니다. 예를 들어 (a=7+2) 표현식의 값은 9입니다. 그 다음에는 다음과 같은 다른 표현식을 작성할 수 있습니다. ((a=7+2)<10), которое в данном случае будет всегда давать истинное значение. Следующая конструкция:

((сh = getch()) == "i")

변수 ch의 값을 입력하고 입력된 값이 문자 "i"인 경우에만 참 결과를 제공할 수 있습니다. 복잡한 표현식을 구성하는 여러 수식을 괄호 안에 작성할 수도 있습니다. 이러한 목적으로 쉼표 연산자가 사용됩니다. 수식은 왼쪽에서 오른쪽으로 평가되며 전체 표현식은 마지막으로 평가된 수식의 값을 사용합니다. 예를 들어 char 유형의 변수가 두 개 있는 경우 표현식은 다음과 같습니다.

z = (x = y, y = getch());

다음 작업을 정의합니다. 변수 y의 값이 변수 x에 할당됩니다. 키보드에서 문자를 입력하고 변수 y에 할당합니다. z는 변수 y의 값을 가져옵니다. 쉼표 연산은 z 변수 뒤에 작성된 할당 연산보다 우선순위가 낮기 때문에 여기에 괄호가 필요합니다. 쉼표 연산은 for 루프 표현식을 구성하는 데 널리 사용되며 여러 제어 변수의 값을 병렬로 변경할 수 있습니다.

중첩된 구조가 허용됩니다. 루프 본문에는 다른 for 문이 있을 수 있습니다.

while 문은 공식적으로 다음과 같이 작성됩니다.

while(표현식) loop_body

괄호 안의 표현식은 0이 아닌(참) 또는 0(거짓) 값을 가질 수 있습니다. true이면 루프 본문이 실행되고 표현식이 다시 평가됩니다. 표현식이 거짓이면 while 루프가 종료됩니다.

do-while 문은 공식적으로 다음과 같이 작성됩니다.

do (loop_body) while (표현식);

while 루프와 do-while 루프의 주요 차이점은 do-while 루프의 본문이 적어도 한 번 실행된다는 것입니다. 루프 본문은 괄호 안의 표현식이 false로 평가될 때까지 실행됩니다. 루프에 들어갈 때 false이면 해당 본문이 정확히 한 번 실행됩니다.

일부 사이클을 다른 사이클 내에 중첩하는 것이 허용됩니다. for, while 및 do - while 연산자는 모든 루프의 본문에 나타날 수 있습니다.

새로운 중단 및 계속 연산자를 루프 본문에서 사용할 수 있습니다. break 연산자는 루프에서 즉시 종료되도록 하고, continue 연산자는 다음 반복을 종료하고 다음 반복을 시작하게 합니다.

조건부 및 무조건 점프 연산자

SI(C) 언어로 된 프로그램에서 조건부 및 무조건 전환을 구성하려면 if - else, switch 및 goto 연산자가 사용됩니다. 그 중 첫 번째는 다음과 같이 작성됩니다.

if (condition_check) 문_1; 그렇지 않으면 연산자_2;

괄호 안의 조건이 true로 평가되면 명령문_1이 실행되고, 거짓이면 명령문_2가 실행됩니다. 하나가 아닌 여러 개의 명령문을 실행해야 하는 경우 중괄호로 묶습니다. if 문에는 else 단어가 포함될 수 없습니다.

if - else 문에서는 키워드 if 및 else 바로 뒤에 다른 문이 와야 합니다. 그 중 적어도 하나가 if 문이면 중첩이라고 합니다. SI(C) 규칙에 따라 else라는 단어는 항상 가장 가까운 선행 if를 나타냅니다.

switch 문을 사용하면 여러 대안 중 하나를 선택할 수 있습니다. 다음과 같은 형식적인 형식으로 작성됩니다.

스위치(표현)

케이스 상수_1: 명령문_1;

케이스 상수_2: 명령문_2;

........ ........

기본값: Operator_default;

여기에서는 괄호 안의 전체 표현식(선택기라고도 함)의 값이 평가되어 모든 상수(상수 표현식)와 비교됩니다. 모든 상수는 달라야 합니다. 일치하는 경우 해당 버전의 연산자(하나 이상의 연산자)가 실행됩니다. 다른 옵션 중 어느 것도 적합하지 않은 경우 default 키워드가 있는 옵션이 구현됩니다(default라는 단어가 누락될 수 있음). 기본값이 없고 모든 비교 결과가 음수이면 어떤 옵션도 실행되지 않습니다.

특정 옵션이 성공적으로 선택된 후 후속 검사를 중지하려면 스위치에서 즉시 종료되도록 break 문을 사용합니다.

중첩된 스위치 구성이 허용됩니다.

다음 형식으로 표현될 수 있는 무조건 전환을 수행하기 위한 규칙을 고려해 보겠습니다.

라벨로 이동;

레이블은 식별자 뒤에 콜론이 오는 것입니다. goto 문은 프로그램 실행이 레이블 앞에 오는 문부터 시작하여 계속되어야 함을 나타냅니다. 해당 goto 문이 있는 함수의 모든 문 앞에 레이블을 배치할 수 있습니다. 발표할 필요는 없습니다.

터보 디버거는 SI(C) 언어 표현의 구문을 완벽하게 지원합니다. 표현식은 연산, 문자열, 변수의 혼합으로 구성됩니다.

마지막 업데이트: 2017년 6월 19일

별도의 작업 집합은 조건식을 나타냅니다. 이러한 연산은 부울 값, 즉 bool 유형의 값을 반환합니다. 식이 true이면 true이고, 식이 false이면 false입니다. 이러한 연산에는 비교 연산과 논리 연산이 포함됩니다.

비교 작업

비교 연산은 두 피연산자를 비교하고 부울 값을 반환합니다. 표현식이 true이면 true이고 표현식이 false이면 false입니다.

    두 피연산자가 같은지 비교합니다. 동일하면 연산은 true를 반환하고, 동일하지 않으면 false를 반환합니다.

    비; // 거짓

    두 피연산자를 비교하여 피연산자가 같지 않으면 true를 반환하고 같으면 false를 반환합니다.

    정수 a = 10; int b = 4; 부울 c = a != b; // 참 bool d = a!=10; // 거짓

    "보다 작음" 작업. 첫 번째 피연산자가 두 번째 피연산자보다 작으면 true를 반환하고, 첫 번째 피연산자가 두 번째 피연산자보다 크면 false를 반환합니다.

    정수 a = 10; int b = 4; 부울 c = a< b; // false

    "이상" 작업 두 피연산자를 비교하여 첫 번째 피연산자가 두 번째 피연산자보다 크면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

    정수 a = 10; int b = 4; 부울 c = a > b; // 참 bool d = a > 25; // 거짓

    연산보다 작거나 같습니다. 두 피연산자를 비교하여 첫 번째 피연산자가 두 번째 피연산자보다 작거나 같으면 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

    정수 a = 10; int b = 4; 부울 c = a<= b; // false bool d = a <= 25; // true

    연산보다 크거나 같습니다. 두 피연산자를 비교하여 첫 번째 피연산자가 두 번째 피연산자보다 크거나 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

    정수 a = 10; int b = 4; bool c = a >= b; // 참 bool d = a >= 25; // 거짓

운영<, > <=, >=는 == 및 !=보다 우선순위가 높습니다.

논리 연산

C#에서는 부울 값을 반환하는 논리 연산자도 정의합니다. 그들은 bool 값을 피연산자로 사용합니다. 일반적으로 관계 및 여러 비교 작업 결합에 적용됩니다.

    논리적 덧셈 연산 또는 논리적 OR. 피연산자 중 하나 이상이 true를 반환하면 true를 반환합니다.

    부울 x1 = (5 > 6) | (4< 6); // 5 >6 - 거짓, 4< 6 - true, поэтому возвращается true bool x2 = (5 >6) | (4 > 6); // 5 > 6 - 거짓, 4 >

    논리적 곱셈 또는 논리적 AND 연산입니다. 두 피연산자가 동시에 true인 경우 true를 반환합니다.

    부울 x1 = (5 > 6) & (4< 6); // 5 >6 - 거짓, 4< 6 - true, поэтому возвращается false bool x2 = (5 < 6) & (4 < 6); // 5 < 6 - true, 4 < 6 - true, поэтому возвращается true

    논리적 추가 작업. 피연산자 중 하나 이상이 true를 반환하면 true를 반환합니다.

    부울 x1 = (5 > 6) || (4< 6); // 5 >6 - 거짓, 4< 6 - true, поэтому возвращается true bool x2 = (5 >6) || (4 > 6); // 5 > 6은 거짓, 4 > 6은 거짓이므로 false가 반환됩니다.

    논리 곱셈 연산. 두 피연산자가 동시에 true인 경우 true를 반환합니다.

    부울 x1 = (5 > 6) && (4< 6); // 5 >6 - 거짓, 4< 6 - true, поэтому возвращается false bool x2 = (5 < 6) && (4 < 6); // 5 < 6 - true, 4 < 6 - true, поэтому возвращается true

    논리적 부정 연산. 하나의 피연산자에 대해 수행되며 피연산자가 false이면 true를 반환합니다. 피연산자가 true이면 연산은 false를 반환합니다.

    부울 a = 참; 부울 b = !a; // 거짓

    배타적 OR 연산. 첫 번째 또는 두 번째 피연산자(둘 다는 아님)가 true이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

    부울 x5 = (5 > 6) ^ (4< 6); // 5 >6 - 거짓, 4< 6 - true, поэтому возвращается true bool x6 = (50 > 6) ^ (4 / 2 < 3); // 50 >6 - 사실, 4/2< 3 - true, поэтому возвращается false

여기에는 두 쌍의 작업이 있습니다 | 그리고 || (& 및 &&도 포함) 유사한 작업을 수행하지만 동일하지는 않습니다.

표현식에서 z=x|y; x와 y 값이 모두 계산됩니다.

표현식에서 z=x||y; 먼저 x 값이 계산되고, 이것이 true인 경우 y 값을 계산하는 것은 더 이상 의미가 없습니다. 어떤 경우에도 z는 이미 true이기 때문입니다. y 값은 x가 false인 경우에만 계산됩니다.

&/&& 연산자 쌍도 마찬가지입니다. z=x 표현식은 x와 y를 모두 평가합니다.

z=x& 표현식에서 x 값이 먼저 계산되고, false와 같으면 y 값을 계산하는 것은 더 이상 의미가 없습니다. 왜냐하면 우리의 경우 z는 어떤 경우에도 이미 false와 같기 때문입니다. y 값은 x가 true인 경우에만 계산됩니다.

따라서 작업 || 및 &&는 표현식의 값을 계산하는 데 걸리는 시간을 줄여 성능을 향상시키므로 계산이 더 편리합니다. 그리고 운영 | &는 숫자에 대한 비트 연산을 수행하는 데 더 적합합니다.

메모. 모든 작업의 ​​결과는 bool 유형의 값입니다.

비교 및 논리 연산의 결과는 bool 유형의 값, 즉 true 또는 false입니다. 이러한 표현식이 정수 값이 필요한 컨텍스트에서 발생하는 경우 true는 1로 변환되고 false는 0으로 변환됩니다. 다음은 주어진 값보다 작은 벡터의 요소 수를 계산하는 코드 조각입니다.

벡터 ::반복자 iter = ivec.beg-in() ; while (iter != ivec.end()) ( // 다음과 동일: e1em_cnt = e1em_cnt + (*iter< some_va1ue) // значение true/false выражения *iter < some_va1ue // превращается в 1 или 0 e1em_cnt += *iter < some_va1ue; ++iter; }

우리는 단순히 카운터에 작음 연산의 결과를 추가합니다. (+= 쌍은 왼쪽에 피연산자를 오른쪽에 피연산자를 추가하는 복합 할당 연산자를 나타냅니다. 동일한 내용을 더 간결하게 작성할 수 있습니다: elem_count = elem_count + n. 이러한 연산자는 섹션 4.4에서 살펴보겠습니다. )
논리 AND(&&)는 두 피연산자가 모두 true인 경우에만 true를 반환합니다. 논리 OR(||)는 피연산자 중 하나 이상이 true인 경우 true로 평가됩니다. 피연산자는 왼쪽에서 오른쪽으로 평가되고 결과 값이 알려지자마자 평가가 종료됩니다. 무슨 뜻이에요? 두 가지 표현을 제시해 보겠습니다.

Expr1 && expr2 expr1 || expr2

첫 번째에서 expr1이 false인 경우 expr2의 값에 관계없이 전체 표현식의 값도 false가 되며 평가조차 되지 않습니다. 두 번째 표현식에서는 expr2에 관계없이 전체 표현식이 true로 평가되므로 expr1이 true이면 expr2가 평가되지 않습니다.
이 계산 방법을 사용하면 하나의 AND 연산자로 여러 표현식을 편리하게 테스트할 수 있습니다.

동안 (ptr != O && ptr->va1ue< upperBound && ptr->va1ue >= 0 && notFound(ia[ ptr->va1ue ])) ( ... )

널 포인터는 어떤 객체도 가리키지 않으므로 널 포인터에 멤버 액세스 작업을 적용하면 오류가 발생합니다(ptr->값). 그러나 ptr이 0이면 첫 번째 단계의 검사에서 하위 표현식의 추가 평가가 중지됩니다. 마찬가지로 두 번째와 세 번째 단계에서는 ptr->value 값이 필요한 범위에 있는지 확인하고, 이 인덱스가 올바르지 않으면 인덱스를 가져오는 작업이 ia 배열에 적용되지 않습니다.
논리 NOT 연산은 유일한 연산자가 false인 경우 true로 평가되고 그 반대의 경우도 마찬가지입니다. 예를 들어:

발견된 부울 = false; // 요소가 발견될 때까지 // ptr은 객체(0이 아님)를 가리킵니다. while (!found && ptr) (found = 1lookup(*ptr); ++ptr; )

하위 표현식

발견된 값이 false인 경우 true를 반환합니다. 이는 보다 간결한 표기법입니다.

발견 == 거짓

비슷하게

더 긴 항목과 동일

만약 (발견 == 참)

비교 연산의 사용은 매우 분명합니다. AND 및 OR과 달리 이러한 표현식의 피연산자가 평가되는 순서는 정의되어 있지 않다는 점만 명심하면 됩니다. 다음은 이러한 오류가 발생할 수 있는 예입니다.

// 주목! 계산 순서는 정의되어 있지 않습니다! if (ia[ 인덱스++ ]< ia[ index ]) // поменять местами элементы

프로그래머는 왼쪽 피연산자가 먼저 평가되고 ia 및 ia 요소가 비교될 것이라고 가정했습니다. 그러나 컴파일러는 왼쪽에서 오른쪽으로 평가하는 것을 보장하지 않습니다. 이 경우 요소 ia가 자체와 비교될 수 ​​있습니다. 보다 이해하기 쉽고 기계 독립적인 코드를 작성하는 것이 훨씬 좋습니다.

만약 (ia[ 인덱스 ]< ia[ index+1 ]) // поменять местами элементы ++index;

가능한 오류의 또 다른 예입니다. 우리는 ival, jval, kval 세 가지 값이 모두 다른지 확인하고 싶었습니다. 우리가 어디에서 잘못됐나요?

// 주목! 이것은 3개의 변수를 서로 비교하는 것이 아닙니다. if (ival != jva1 != kva1) // 뭔가를 하세요 ...

0, 1, 0의 값은 true로 평가됩니다. 왜? 먼저 ival != jval을 확인한 후 이 확인 결과(true/false - 1/0으로 변환)를 kval과 비교합니다. 우리는 명시적으로 다음과 같이 작성했어야 했습니다.
if (ival != jva1 && ival != kva1 && jva1 != kva1)
//뭔가를 하려고...

연습 4.4

올바르지 않거나 용납할 수 없는 표현을 찾아 설명하세요. 어떻게 변경할 수 있나요? (객체 유형은 이 예에서 아무런 역할을 하지 않습니다.)
(a) ptr->iva1 != 0
(c) ptr != 0 && *ptr++
(e)vec[iva1++]<= vec[ ival ];
(b) ival != jva1< kva1 (d) iva1++ && ival

연습 4.5

C++ 언어는 컴파일러가 최적의 방식으로 비교 작업을 수행할 수 있도록 비교 작업이 평가되는 순서를 지정하지 않습니다. 이 경우 표현식이 왼쪽에서 오른쪽으로 평가된다고 가정하는 함정을 피하기 위해 효율성을 희생할 가치가 있다고 생각하십니까?

C 언어에서는 객체에 대해 다양한 작업을 수행할 수 있습니다.

  • 할당 작업;
  • 관계 운영;
  • 산수;
  • 두뇌 티저;
  • 전단 작업.

작업 결과는 숫자입니다.

작업은 이진 또는 단항일 수 있습니다.
이진 연산은 두 개체에 대해 수행되고 단항 연산은 하나에 대해 수행됩니다.

할당 연산자

할당 작업은 = 기호로 표시되며 2단계로 수행됩니다.

  • 오른쪽의 식이 계산됩니다.
  • 결과는 왼쪽의 피연산자에 할당됩니다.

개체 = 표현;

예:

int a = 4; // 변수 a에는 값 4가 할당됩니다.
int b;
b = a + 2; // 변수 b에는 오른쪽에서 계산된 값 6이 할당됩니다.

할당 작업의 왼쪽과 오른쪽에 있는 개체의 유형이 다른 경우 명시적인 유형 캐스팅 작업이 사용됩니다.
객체 = (유형)표현식;

예:

부동 a = 241.5;
// 나눗셈의 나머지 부분을 계산하기 전에 a는 정수 유형으로 캐스팅됩니다.
int b = (int )a % 2; // b = 1

관계 작업

기본 관계 작업:

  • == 동등한 - 동등성 테스트;
  • != 같지 않음 - 불평등을 확인합니다.
  • < 더 적은;
  • > 더;
  • <= 작거나 같음;
  • >= 그 이상 또는 같음.

관계 연산은 조건과 분기를 구성하는 데 사용됩니다. 이 연산의 결과는 1비트이며, 연산 결과가 참이면 그 값은 1이고 연산 결과가 거짓이면 0입니다.

산술 연산

기본 이진 연산(우선순위 내림차순):

  • * - 곱셈;
  • / - 분할;
  • + - 덧셈;
  • - 빼기;
  • % 정수 나눗셈의 나머지입니다.

기본 단항 연산:

  • ++ - 증가(1씩 증가)
  • -- - 감소(1씩 감소)
  • — 부호 변경.

증가 또는 감소 연산이 포함된 표현식을 평가한 결과는 연산 기호가 있는 위치(객체 앞 또는 뒤)에 따라 달라집니다. 연산이 객체 앞에 위치하면 변수의 값이 먼저 1로 변경된 후 이 값을 사용하여 다음 연산을 수행합니다. 수술을 하면 ++ 또는 변수 뒤에 위치하면 먼저 연산을 수행한 후 변수의 값을 1로 변경합니다.

예:

이진 산술 연산은 할당 연산자와 결합될 수 있습니다.

  • 객체 *= 표현식; // 객체 = 객체 * 표현식
  • 객체 /= 표현식; // 객체 = 객체 / 표현식
  • 객체 += 표현식; // 객체 = 객체 + 표현식
  • 객체 -= 표현식; // 객체 = 객체 - 표현식
  • 개체 %= 표현식; // 객체 = 객체 % 표현식

논리 연산

논리 연산은 두 그룹으로 나뉩니다.

  • 가정 어구;
  • 비트별.

조건부 논리 연산은 if 조건 테스트 연산에서 가장 자주 사용되며 모든 객체에서 수행될 수 있습니다. 조건부 논리 연산의 결과:

  • 표현식이 참이면 1이고, 그렇지 않으면 1입니다.
  • 표현식이 거짓인 경우 0입니다.

일반적으로 0을 제외한 모든 값은 조건부 논리 연산자에 의해 참으로 해석됩니다.

기본 조건부 논리 연산:

  • && — 및 (바이너리) - 모든 관계 작업을 동시에 실행해야 합니다.
  • || — 또는(이진) - 최소한 하나의 관계 연산이 필요합니다.
  • ! - NOT(단항) - 관계 연산을 실행하지 않아야 합니다.

비트 논리 연산은 비트에서 작동하며 각 비트는 0 또는 1의 두 가지 값만 사용할 수 있습니다.

C 언어의 기본 비트 논리 연산:

  • & 결합(논리적 AND)은 두 피연산자가 모두 1인 경우(일반적으로 모든 피연산자가 1인 경우)에만 결과가 1인 이항 연산입니다.
  • | 논리합(논리 OR)은 피연산자 중 하나 이상이 1일 때 결과가 1인 이항 연산입니다.
  • ~ 반전(논리적 NOT)은 단항 연산으로, 피연산자가 1이면 결과는 0이고, 피연산자가 0이면 1입니다.
  • ^ 배타적 OR은 두 피연산자 중 하나만 1인 경우(일반적으로 입력 피연산자 집합에 홀수 개의 1이 있는 경우) 결과가 1이 되는 이진 연산입니다.

각 비트에 대해 연산 결과는 표에 따라 얻어집니다.

a&b | 비 ~a a^b
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0

예:

1
2
3
4
5
6
7

부호 없는 문자 a = 14; //a = 0000 1110
부호 없는 문자 b = 9; // b = 0000 1001
부호 없는 문자 c, d, e, f;
c = a&b; // c = 8 = 0000 1000
d = a | 비; // d = 15 = 0000 1111
e = ~a; // 전자 = 241 = 1111 0001
f = a^b; // f = 7 = 0000 0111


비트별 연산을 사용하면 숫자의 개별 비트를 설정하고 재설정할 수 있습니다. 이러한 목적으로 사용됩니다 비트 마스킹. 바이트의 각 비트 설정에 해당하는 마스크가 표에 표시됩니다.

조금 마스크
0 0x01
1 0x02
2 0x04
3 0x08
4 0x10
5 0x20
6 0x40
7 0x80

특정 비트를 설정하려면 마스크의 해당 비트를 1로 설정하고 마스크인 상수를 비트별 논리 OR 연산을 수행해야 합니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: