crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
voipp
  опции профиля:
сообщение 26.3.2011, 0:53
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


#include<iostream>
#include<string.h>

using namespace std;

int main(){
    char str1[8]="privet!";
    char str2[8],str3[10],str4[1];
    strcpy(str4,str1);
    printf("%s \n %d  %d",str4,strlen(str4),sizeof(str4));
    (!strcmp(str4,str1))&&(printf("!!!"));
    system("pause");
}


после выполнения этого кода, вот что вылезает на экран: privet!
7 1 нажмите на кнопку....
откуда такие чудеса?если заменить strcpy на strcpy_s, то в случае разных по длине строк, в результирующую строку запишется 0?

и еще вопрос не по теме: если написать строчку a && b && c && .... то как будет вычисляться это выражение если a,b,c,... имеют тип bool

Сообщение отредактировал voipp - 26.3.2011, 1:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 26.3.2011, 11:39
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата
(!strcmp(str4,str1))&&(printf("!!!"));

это строчка эквивалентна следующему:

strcmp(str4,str1);
printf("!!!");

выводится
Цитата
privet!
7 1!!!Для продолжения нажмите любую клавишу . . .


а вот если написать
if (a && b && c)
{
}

где выражение a==false , то выражения b и c даже не будут считаться (если это функции - то не будут вызваны)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 31.3.2011, 0:17
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 26.3.2011, 11:39) *
Цитата
(!strcmp(str4,str1))&&(printf("!!!"));

это строчка эквивалентна следующему:

strcmp(str4,str1);
printf("!!!");


Неа, не эквивалентные! сначала выполняется (!strcmp(str4,str1)) если оно ложно, то второе выполнятся не будет.Так устроен компилятор

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 31.3.2011, 7:15
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


voipp, во первых, я запустил и проверил. Ожидаемо вывелось "7 1!!!"

тут выполнятся обе части, так как нет оператора if перед скобками - в этом случае компилятор рассматривает выражение так:
>>(!strcmp(str4,str1))&&(printf("!!!"));

1) считаем выражение strcmp(str4,str1) ->A
2) считаем выражение printf("!!!") ->B
3) выполняем бинарный оператор A&&B -> [результат оператора никуда не сохраняется, нигде не используется]

---------------------------------------

Если бы был if, то так:

>>if(!strcmp(str4,str1))&&(printf("!!!"));
1) считаем выражение strcmp(str4,str1)
2) если оно ненулевое - всё выражение под if ложно, далее не считаем.
3) иначе, считаем выражение printf("!!!")
4) если оно нулевое - всё выражение под if ложно

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
voipp
  опции профиля:
сообщение 2.4.2011, 1:25
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 116
Регистрация: 20.10.2009
Из: Msk
Пользователь №: 1166

Спасибо сказали: 0 раз(а)




Репутация:   0  


а попробуйте вот так :
(0)&&(printf("HELLO!"))

:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.4.2011, 18:31
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


voipp, вот теперь убедил :) Значит, оператор работает одинаково как в условии, так и в свободном виде. Хотя это нелогично немного - ведь я могу переопределить оператор
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.3.2025, 23:35